From 3e0c69d77ee0ef9fb2ef2cd0aba19953cc81c8e7 Mon Sep 17 00:00:00 2001
From: "Sylvain \"Telkostrasz\" Cossement"
Date: Sun, 11 Jan 2015 12:32:48 +0000
Subject: [PATCH]
---
totalRP3/tags/0.2.7/Bindings.xml | 27 +
totalRP3/tags/0.2.7/LICENSE.txt | 202 +
totalRP3/tags/0.2.7/UI.xsd | 1111 ++
totalRP3/tags/0.2.7/core/core.xml | 69 +
totalRP3/tags/0.2.7/core/impl/about.lua | 35 +
.../core/impl/communication_protocol.lua | 265 +
.../impl/communication_protocol_broadcast.lua | 131 +
.../tags/0.2.7/core/impl/configuration.lua | 406 +
totalRP3/tags/0.2.7/core/impl/events.lua | 111 +
totalRP3/tags/0.2.7/core/impl/globals.lua | 80 +
.../tags/0.2.7/core/impl/locale/locale.lua | 160 +
.../tags/0.2.7/core/impl/locale/locale.xml | 30 +
.../0.2.7/core/impl/locale/locale_deDE.lua | 845 +
.../0.2.7/core/impl/locale/locale_enUS.lua | 814 +
.../0.2.7/core/impl/locale/locale_esES.lua | 838 +
.../0.2.7/core/impl/locale/locale_frFR.lua | 861 +
.../0.2.7/core/impl/locale/locale_ruRU.lua | 355 +
.../0.2.7/core/impl/locale/locale_zhCN.lua | 125 +
.../tags/0.2.7/core/impl/main_structure.lua | 447 +
totalRP3/tags/0.2.7/core/impl/popup.lua | 629 +
totalRP3/tags/0.2.7/core/impl/profiles.lua | 466 +
.../0.2.7/core/impl/script/script_effects.lua | 44 +
.../core/impl/script/script_generation.lua | 455 +
.../core/impl/script/script_operands.lua | 49 +
totalRP3/tags/0.2.7/core/impl/slash.lua | 71 +
totalRP3/tags/0.2.7/core/impl/ui_main.lua | 145 +
totalRP3/tags/0.2.7/core/impl/ui_tools.lua | 900 +
totalRP3/tags/0.2.7/core/impl/utils.lua | 669 +
totalRP3/tags/0.2.7/core/ui/about.xml | 24 +
.../tags/0.2.7/core/ui/browsers/colors.xml | 142 +
.../0.2.7/core/ui/browsers/companions.xml | 146 +
.../tags/0.2.7/core/ui/browsers/icons.xml | 176 +
.../tags/0.2.7/core/ui/browsers/images.xml | 147 +
.../tags/0.2.7/core/ui/browsers/musics.xml | 167 +
totalRP3/tags/0.2.7/core/ui/configuration.xml | 323 +
totalRP3/tags/0.2.7/core/ui/main.xml | 358 +
totalRP3/tags/0.2.7/core/ui/profiles.xml | 255 +
totalRP3/tags/0.2.7/core/ui/widgets.xml | 673 +
.../0.2.7/libs/AceAddon-3.0/AceAddon-3.0.lua | 659 +
.../0.2.7/libs/AceAddon-3.0/AceAddon-3.0.xml | 4 +
.../AceSerializer-3.0/AceSerializer-3.0.lua | 283 +
.../AceSerializer-3.0/AceSerializer-3.0.xml | 4 +
.../CallbackHandler-1.0.lua | 239 +
.../CallbackHandler-1.0.xml | 4 +
totalRP3/tags/0.2.7/libs/ChatThrottleLib.lua | 522 +
.../0.2.7/libs/LibCompress/LibCompress.lua | 1126 ++
.../libs/LibDBIcon-1.0/LibDBIcon-1.0.lua | 361 +
.../LibDataBroker-1.1/LibDataBroker-1.1.lua | 90 +
totalRP3/tags/0.2.7/libs/LibStub/LibStub.lua | 30 +
totalRP3/tags/0.2.7/libs/libs.xml | 29 +
.../0.2.7/modules/chatframe/chatframe.lua | 472 +
.../0.2.7/modules/chatframe/chatframe.xml | 22 +
.../0.2.7/modules/dashboard/dashboard.lua | 600 +
.../0.2.7/modules/dashboard/dashboard.xml | 247 +
.../0.2.7/modules/databroker/databroker.lua | 265 +
totalRP3/tags/0.2.7/modules/flyway/flyway.lua | 45 +
.../0.2.7/modules/flyway/flyway_patches.lua | 26 +
.../0.2.7/modules/gamemaster/gamemaster.xml | 28 +
.../modules/gamemaster/gamemaster_main.lua | 18 +
.../modules/gamemaster/gamemaster_main.xml | 22 +
.../modules/gamemaster/gamemaster_tools.lua | 18 +
.../modules/gamemaster/gamemaster_tools.xml | 22 +
.../0.2.7/modules/importer/FlagRSP2_API.lua | 96 +
.../0.2.7/modules/importer/FlagRSP_API.lua | 93 +
.../tags/0.2.7/modules/importer/MRP_API.lua | 140 +
.../tags/0.2.7/modules/importer/XRP_API.lua | 145 +
.../tags/0.2.7/modules/importer/importer.lua | 189 +
.../tags/0.2.7/modules/importer/importer.xml | 150 +
.../0.2.7/modules/importer/totalRP2_API.lua | 241 +
.../tags/0.2.7/modules/module_management.lua | 351 +
totalRP3/tags/0.2.7/modules/modules.xml | 151 +
.../register/characters/register_about.lua | 1029 ++
.../characters/register_characteristics.lua | 954 ++
.../register/characters/register_ignore.lua | 241 +
.../register/characters/register_main.lua | 495 +
.../register/characters/register_misc.lua | 879 +
.../register/characters/register_ui_about.xml | 601 +
.../register_ui_characteristics.xml | 519 +
.../register/characters/register_ui_main.xml | 72 +
.../register/characters/register_ui_misc.xml | 425 +
.../companions/register_companions_main.lua | 451 +
.../companions/register_companions_page.lua | 514 +
.../register_companions_profiles.lua | 635 +
.../register_ui_companions_main.xml | 29 +
.../register_ui_companions_page.xml | 262 +
.../register_ui_companions_profiles.xml | 24 +
.../register/main/register_exchange.lua | 411 +
.../register/main/register_glance_bar.lua | 360 +
.../modules/register/main/register_list.lua | 911 +
.../register/main/register_tooltip.lua | 1180 ++
.../register/main/register_ui_glance_bar.xml | 100 +
.../register/main/register_ui_list.xml | 414 +
.../modules/register/msp/register_msp.lua | 794 +
.../modules/register/register_includes.xml | 44 +
.../modules/targetframe/target_frame.lua | 376 +
.../modules/targetframe/target_frame.xml | 50 +
.../tags/0.2.7/modules/toolbar/toolbar.lua | 294 +
.../tags/0.2.7/modules/toolbar/toolbar.xml | 84 +
totalRP3/tags/0.2.7/resources/iconList.lua | 14226 ++++++++++++++++
totalRP3/tags/0.2.7/resources/imageList.lua | 322 +
totalRP3/tags/0.2.7/resources/musicList.lua | 2363 +++
totalRP3/tags/0.2.7/resources/resources.txt | 11 +
totalRP3/tags/0.2.7/resources/resources.xml | 25 +
totalRP3/tags/0.2.7/resources/trp3logo.blp | Bin 0 -> 175972 bytes
totalRP3/tags/0.2.7/resources/trp3minimap.tga | Bin 0 -> 3851 bytes
totalRP3/tags/0.2.7/totalRP3.lua | 113 +
totalRP3/tags/0.2.7/totalRP3.toc | 11 +
totalRP3/tags/0.2.7/totalRP3.xml | 37 +
108 files changed, 48699 insertions(+)
create mode 100644 totalRP3/tags/0.2.7/Bindings.xml
create mode 100644 totalRP3/tags/0.2.7/LICENSE.txt
create mode 100644 totalRP3/tags/0.2.7/UI.xsd
create mode 100644 totalRP3/tags/0.2.7/core/core.xml
create mode 100644 totalRP3/tags/0.2.7/core/impl/about.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/communication_protocol.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/communication_protocol_broadcast.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/configuration.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/events.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/globals.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale.xml
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale_deDE.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale_enUS.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale_esES.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale_frFR.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale_ruRU.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/locale/locale_zhCN.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/main_structure.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/popup.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/profiles.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/script/script_effects.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/script/script_generation.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/script/script_operands.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/slash.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/ui_main.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/ui_tools.lua
create mode 100644 totalRP3/tags/0.2.7/core/impl/utils.lua
create mode 100644 totalRP3/tags/0.2.7/core/ui/about.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/browsers/colors.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/browsers/companions.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/browsers/icons.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/browsers/images.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/browsers/musics.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/configuration.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/main.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/profiles.xml
create mode 100644 totalRP3/tags/0.2.7/core/ui/widgets.xml
create mode 100644 totalRP3/tags/0.2.7/libs/AceAddon-3.0/AceAddon-3.0.lua
create mode 100644 totalRP3/tags/0.2.7/libs/AceAddon-3.0/AceAddon-3.0.xml
create mode 100644 totalRP3/tags/0.2.7/libs/AceSerializer-3.0/AceSerializer-3.0.lua
create mode 100644 totalRP3/tags/0.2.7/libs/AceSerializer-3.0/AceSerializer-3.0.xml
create mode 100755 totalRP3/tags/0.2.7/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
create mode 100755 totalRP3/tags/0.2.7/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
create mode 100644 totalRP3/tags/0.2.7/libs/ChatThrottleLib.lua
create mode 100644 totalRP3/tags/0.2.7/libs/LibCompress/LibCompress.lua
create mode 100755 totalRP3/tags/0.2.7/libs/LibDBIcon-1.0/LibDBIcon-1.0.lua
create mode 100755 totalRP3/tags/0.2.7/libs/LibDataBroker-1.1/LibDataBroker-1.1.lua
create mode 100644 totalRP3/tags/0.2.7/libs/LibStub/LibStub.lua
create mode 100644 totalRP3/tags/0.2.7/libs/libs.xml
create mode 100644 totalRP3/tags/0.2.7/modules/chatframe/chatframe.lua
create mode 100644 totalRP3/tags/0.2.7/modules/chatframe/chatframe.xml
create mode 100644 totalRP3/tags/0.2.7/modules/dashboard/dashboard.lua
create mode 100644 totalRP3/tags/0.2.7/modules/dashboard/dashboard.xml
create mode 100644 totalRP3/tags/0.2.7/modules/databroker/databroker.lua
create mode 100644 totalRP3/tags/0.2.7/modules/flyway/flyway.lua
create mode 100644 totalRP3/tags/0.2.7/modules/flyway/flyway_patches.lua
create mode 100644 totalRP3/tags/0.2.7/modules/gamemaster/gamemaster.xml
create mode 100644 totalRP3/tags/0.2.7/modules/gamemaster/gamemaster_main.lua
create mode 100644 totalRP3/tags/0.2.7/modules/gamemaster/gamemaster_main.xml
create mode 100644 totalRP3/tags/0.2.7/modules/gamemaster/gamemaster_tools.lua
create mode 100644 totalRP3/tags/0.2.7/modules/gamemaster/gamemaster_tools.xml
create mode 100644 totalRP3/tags/0.2.7/modules/importer/FlagRSP2_API.lua
create mode 100644 totalRP3/tags/0.2.7/modules/importer/FlagRSP_API.lua
create mode 100644 totalRP3/tags/0.2.7/modules/importer/MRP_API.lua
create mode 100644 totalRP3/tags/0.2.7/modules/importer/XRP_API.lua
create mode 100644 totalRP3/tags/0.2.7/modules/importer/importer.lua
create mode 100644 totalRP3/tags/0.2.7/modules/importer/importer.xml
create mode 100644 totalRP3/tags/0.2.7/modules/importer/totalRP2_API.lua
create mode 100644 totalRP3/tags/0.2.7/modules/module_management.lua
create mode 100644 totalRP3/tags/0.2.7/modules/modules.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_about.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_characteristics.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_ignore.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_main.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_misc.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_ui_about.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_ui_characteristics.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_ui_main.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/characters/register_ui_misc.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/companions/register_companions_main.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/companions/register_companions_page.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/companions/register_companions_profiles.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/companions/register_ui_companions_main.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/companions/register_ui_companions_page.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/companions/register_ui_companions_profiles.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/main/register_exchange.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/main/register_glance_bar.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/main/register_list.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/main/register_tooltip.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/main/register_ui_glance_bar.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/main/register_ui_list.xml
create mode 100644 totalRP3/tags/0.2.7/modules/register/msp/register_msp.lua
create mode 100644 totalRP3/tags/0.2.7/modules/register/register_includes.xml
create mode 100644 totalRP3/tags/0.2.7/modules/targetframe/target_frame.lua
create mode 100644 totalRP3/tags/0.2.7/modules/targetframe/target_frame.xml
create mode 100644 totalRP3/tags/0.2.7/modules/toolbar/toolbar.lua
create mode 100644 totalRP3/tags/0.2.7/modules/toolbar/toolbar.xml
create mode 100644 totalRP3/tags/0.2.7/resources/iconList.lua
create mode 100644 totalRP3/tags/0.2.7/resources/imageList.lua
create mode 100644 totalRP3/tags/0.2.7/resources/musicList.lua
create mode 100644 totalRP3/tags/0.2.7/resources/resources.txt
create mode 100644 totalRP3/tags/0.2.7/resources/resources.xml
create mode 100644 totalRP3/tags/0.2.7/resources/trp3logo.blp
create mode 100644 totalRP3/tags/0.2.7/resources/trp3minimap.tga
create mode 100644 totalRP3/tags/0.2.7/totalRP3.lua
create mode 100644 totalRP3/tags/0.2.7/totalRP3.toc
create mode 100644 totalRP3/tags/0.2.7/totalRP3.xml
diff --git a/totalRP3/tags/0.2.7/Bindings.xml b/totalRP3/tags/0.2.7/Bindings.xml
new file mode 100644
index 000000000..7fe2bdc1a
--- /dev/null
+++ b/totalRP3/tags/0.2.7/Bindings.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ TRP3_API.navigation.switchMainFrame();
+
+
+ if TRP3_API.toolbar then
+ TRP3_API.toolbar.switch();
+ end
+
+
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/LICENSE.txt b/totalRP3/tags/0.2.7/LICENSE.txt
new file mode 100644
index 000000000..9b5e4019d
--- /dev/null
+++ b/totalRP3/tags/0.2.7/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/UI.xsd b/totalRP3/tags/0.2.7/UI.xsd
new file mode 100644
index 000000000..5d1217ab6
--- /dev/null
+++ b/totalRP3/tags/0.2.7/UI.xsd
@@ -0,0 +1,1111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/core.xml b/totalRP3/tags/0.2.7/core/core.xml
new file mode 100644
index 000000000..d9041073b
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/core.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+ self.isFading = nil;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/about.lua b/totalRP3/tags/0.2.7/core/impl/about.lua
new file mode 100644
index 000000000..718c673b0
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/about.lua
@@ -0,0 +1,35 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- About page
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local registerMenu, selectMenu = TRP3_API.navigation.menu.registerMenu, TRP3_API.navigation.menu.selectMenu;
+local registerPage, setPage = TRP3_API.navigation.page.registerPage, TRP3_API.navigation.page.setPage;
+local loc = TRP3_API.locale.getText;
+local _G, tonumber, math, tinsert, type, assert, tostring, pairs, sort, strconcat = _G, tonumber, math, tinsert, type, assert, tostring, pairs, table.sort, strconcat;
+
+
+TRP3_API.events.listenToEvent(TRP3_API.events.WORKFLOW_ON_LOADED, function()
+
+ -- Page and menu
+-- registerMenu({
+-- id = "main_zz_about",
+-- text = loc("ABOUT_TITLE"),
+-- onSelected = function() end,
+-- });
+
+end);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/communication_protocol.lua b/totalRP3/tags/0.2.7/core/impl/communication_protocol.lua
new file mode 100644
index 000000000..d7fd7e594
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/communication_protocol.lua
@@ -0,0 +1,265 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Communication protocol and API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- Public accessor
+TRP3_API.communication = {};
+
+-- imports
+local RegisterAddonMessagePrefix = RegisterAddonMessagePrefix;
+local tostring, pairs, assert, string, wipe, tinsert, type, math = tostring, pairs, assert, string, wipe, tinsert, type, math;
+local tconcat = table.concat;
+local ChatThrottleLib = ChatThrottleLib;
+local Utils = TRP3_API.utils;
+local Log = Utils.log;
+local Comm, isIDIgnored = TRP3_API.communication;
+local libSerializer = LibStub:GetLibrary("AceSerializer-3.0");
+
+-- function definition
+local handlePacketsIn;
+local handleStructureIn;
+local receiveObject;
+local onAddonMessageReceived;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LAYER 0 : CONNECTION LAYER
+-- Makes connection with Wow communication functions, or debug functions
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local wowCom_prefix = "TRP3";
+local interface_id = {
+ WOW = 1,
+ DIRECT_RELAY = 2,
+ DIRECT_PRINT = 3
+};
+Comm.interface_id = interface_id;
+local selected_interface_id = interface_id.WOW;
+
+function Comm.init()
+ isIDIgnored = TRP3_API.register.isIDIgnored;
+ Utils.event.registerHandler("CHAT_MSG_ADDON", onAddonMessageReceived);
+ Utils.event.registerHandler("PLAYER_ENTERING_WORLD", function()
+ RegisterAddonMessagePrefix(wowCom_prefix);
+ end);
+end
+
+-- This is the main communication interface, using ChatThrottleLib to
+-- avoid being kicked by the server when sending a lot of data.
+local function wowCommunicationInterface(packet, target, priority)
+ ChatThrottleLib:SendAddonMessage(priority or "BULK", wowCom_prefix, packet, "WHISPER", target);
+end
+
+function onAddonMessageReceived(...)
+ local prefix, packet , distributionType, sender = ...;
+ if prefix == wowCom_prefix then
+ -- TODO: check here ignore
+ handlePacketsIn(packet, sender);
+ end
+end
+
+-- This communication interface print all sent message to the chat frame.
+-- Note that the messages are not really sent.
+local function directPrint(packet, target, priority)
+ Log.log("Message to: "..tostring(target).." - Priority: "..tostring(priority)..(" - Message(%s):"):format(packet:len()));
+ Log.log(packet:sub(4));
+end
+
+-- A "direct relay" (like localhost) communication interface, used for development purpose.
+-- Any message sent to this communication interface is directly rerouted to the user itself.
+-- Note that the messages are not really sent.
+local function directRelayInterface(packet, target, priority)
+ directPrint(packet, target, priority)
+ handlePacketsIn(packet, target);
+end
+
+-- Returns the function reference to be used as communication interface.
+local function getCommunicationInterface()
+ if selected_interface_id == interface_id.WOW then return wowCommunicationInterface end
+ if selected_interface_id == interface_id.DIRECT_RELAY then return directRelayInterface end
+ if selected_interface_id == interface_id.DIRECT_PRINT then return directPrint end
+end
+
+-- Changes the communication interface to use
+function Comm.setInterfaceID(id)
+ selected_interface_id = id;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LAYER 1 : PACKET LAYER
+-- Packet sending and receiving
+-- Handles packet sequences
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- 254 - TRP3(4) - MESSAGE_ID(2) - control character(1)
+local AVAILABLE_CHARACTERS = 246;
+local NEXT_PACKET_PREFIX = "\001";
+local LAST_PACKET_PREFIX = "\002";
+local PACKETS_RECEPTOR = {};
+
+-- Send each packet to the current communication interface.
+local function handlePacketsOut(messageID, packets, target, priority)
+ if #packets ~= 0 then
+ for index, packet in pairs(packets) do
+ assert(packet:len() <= AVAILABLE_CHARACTERS, "Too long packet: " .. packet:len());
+ local control = NEXT_PACKET_PREFIX;
+ if index == #packets then
+ control = LAST_PACKET_PREFIX;
+ end
+ getCommunicationInterface()(messageID..control..packet, target, priority);
+ end
+ end
+end
+
+local function savePacket(sender, messageID, packet)
+ if not PACKETS_RECEPTOR[sender] then
+ PACKETS_RECEPTOR[sender] = {};
+ end
+ if not PACKETS_RECEPTOR[sender][messageID] then
+ PACKETS_RECEPTOR[sender][messageID] = {};
+ end
+ tinsert(PACKETS_RECEPTOR[sender][messageID], packet);
+end
+
+local function getPackets(sender, messageID)
+ assert(PACKETS_RECEPTOR[sender] and PACKETS_RECEPTOR[sender][messageID], "No stored packets from "..sender.." for structure "..messageID);
+ return PACKETS_RECEPTOR[sender][messageID];
+end
+
+local function endPacket(sender, messageID)
+ assert(PACKETS_RECEPTOR[sender] and PACKETS_RECEPTOR[sender][messageID], "No stored packets from "..sender.." for structure "..messageID);
+ wipe(PACKETS_RECEPTOR[sender][messageID]);
+ PACKETS_RECEPTOR[sender][messageID] = nil;
+end
+
+function handlePacketsIn(packet, sender)
+ if not isIDIgnored(sender) then
+ local messageID = packet:sub(1, 2);
+ local control = packet:sub(3, 3);
+ savePacket(sender, messageID, packet:sub(4));
+ if control == LAST_PACKET_PREFIX then
+ handleStructureIn(getPackets(sender, messageID), sender);
+ endPacket(sender, messageID);
+ end
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LAYER 2 : MESSAGE LAYER
+-- Structure-to-Message serialization / deserialization
+-- Message cutting in packets / Message reconstitution
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local MESSAGE_ID_1 = 1;
+local MESSAGE_ID_2 = 1;
+local MESSAGE_ID = string.char(MESSAGE_ID_1, MESSAGE_ID_2);
+
+-- Message IDs are 256 base number encoded on 2 chars (256*256 = 65536 available Message IDs)
+local function getMessageIDAndIncrement()
+ local toReturn = MESSAGE_ID;
+ MESSAGE_ID_2 = MESSAGE_ID_2 + 1;
+ if MESSAGE_ID_2 > 255 then
+ MESSAGE_ID_2 = 1;
+ MESSAGE_ID_1 = MESSAGE_ID_1 + 1;
+ if MESSAGE_ID_1 > 255 then
+ MESSAGE_ID_1 = 1;
+ end
+ end
+ MESSAGE_ID = string.char(MESSAGE_ID_1, MESSAGE_ID_2);
+ return toReturn;
+end
+
+-- Convert structure to message, cut message in packets.
+local function handleStructureOut(structure, target, priority)
+ local message = libSerializer:Serialize(structure);
+ local messageID = getMessageIDAndIncrement();
+ local messageSize = message:len();
+ local packetTab = {};
+ local index = 1;
+ while index <= messageSize do
+ tinsert(packetTab, message:sub(index, index + (AVAILABLE_CHARACTERS - 1)));
+ index = index + AVAILABLE_CHARACTERS;
+ end
+ handlePacketsOut(messageID, packetTab, target, priority);
+end
+
+-- Reassemble the message based on the packets, and deserialize it.
+function handleStructureIn(packets, sender)
+ local message = tconcat(packets);
+ local status, structure = libSerializer:Deserialize(message);
+ if status then
+ receiveObject(structure, sender);
+ else
+ Log.log(("Deserialization error. Message:\n%s"):format(message), Log.level.SEVERE);
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LAYER 3 : STRUCTURE LAYER
+-- "What to do with the structure received / to send ?"
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local PREFIX_REGISTRATION = {};
+
+-- Register a function to callback when receiving a object attached to the given prefix
+ function Comm.registerProtocolPrefix(prefix, callback)
+ assert(prefix and callback and type(callback) == "function", "Usage: prefix, callback");
+ if PREFIX_REGISTRATION[prefix] == nil then
+ PREFIX_REGISTRATION[prefix] = {};
+ end
+ tinsert(PREFIX_REGISTRATION[prefix], callback);
+end
+
+-- Send a object to a player
+-- Prefix must have been registered before use this function
+-- The object can be any lua type (numbers, strings, tables, but NOT functions or userdatas)
+-- Priority is optional ("Bulk" by default)
+function Comm.sendObject(prefix, object, target, priority)
+ assert(PREFIX_REGISTRATION[prefix] ~= nil, "Unregistered prefix: "..prefix);
+ if not isIDIgnored(target) then
+ if not target:match("[^%-]+%-[^%-]+") then
+ Log.log("Trying to send data to bad formed target: " .. target, Log.level.WARNING);
+ return; -- Avoid display "The player "Pouic-" doesn't seemed to be online".
+ end
+ local structure = {prefix, object};
+ handleStructureOut(structure, target, priority);
+ end
+end
+
+-- Receive a structure from a player (sender)
+-- Call any callback registered for this prefix.
+-- Structure[1] contains the prefix, structure[2] contains the object
+function receiveObject(structure, sender)
+ if type(structure) == "table" and #structure == 2 then
+ local prefix = structure[1];
+ if PREFIX_REGISTRATION[prefix] then
+ for _, callback in pairs(PREFIX_REGISTRATION[prefix]) do
+ callback(structure[2], sender);
+ end
+ else
+ Log.log("No registration for prefix: " .. prefix, Log.level.INFO);
+ end
+ else
+ Log.log("Bad structure composition.", Log.level.SEVERE);
+ end
+end
+
+-- Estimate the number of packet needed to send a object.
+function Comm.estimateStructureLoad(object)
+ assert(object, "Object nil");
+ return math.ceil((#(libSerializer:Serialize({"MOCK", object}))) / AVAILABLE_CHARACTERS);
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/communication_protocol_broadcast.lua b/totalRP3/tags/0.2.7/core/impl/communication_protocol_broadcast.lua
new file mode 100644
index 000000000..9ea876a56
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/communication_protocol_broadcast.lua
@@ -0,0 +1,131 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Broadcast communication system
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- imports
+local GetChannelRosterInfo = GetChannelRosterInfo;
+local GetChannelDisplayInfo = GetChannelDisplayInfo;
+local GetChannelName = GetChannelName;
+local JoinChannelByName = JoinChannelByName;
+local RegisterAddonMessagePrefix = RegisterAddonMessagePrefix;
+local wipe, string = wipe, string;
+local ChatThrottleLib = ChatThrottleLib;
+local Globals = TRP3_API.globals;
+local Utils = TRP3_API.utils;
+local Log = Utils.log;
+local Comm = TRP3_API.communication;
+local unitIDToInfo = Utils.str.unitIDToInfo;
+local getConfigValue = TRP3_API.configuration.getValue;
+
+Comm.broadcast = {};
+
+local function config_UseBroadcast()
+ return getConfigValue("comm_broad_use");
+end
+
+local function config_BroadcastChannel()
+ return getConfigValue("comm_broad_chan");
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Communication protocol
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local connectedPlayers = {};
+
+Comm.broadcast.isPlayerBroadcastable = function(playerName)
+ return connectedPlayers[playerName] ~= nil;
+end
+
+Comm.broadcast.getPlayers = function()
+ return connectedPlayers;
+end
+
+Comm.broadcast.resetPlayers = function()
+ if not config_UseBroadcast() then
+ return nil;
+ end
+ local channelName;
+ wipe(connectedPlayers);
+ for i=1, MAX_CHANNEL_BUTTONS, 1 do
+ channelName = GetChannelDisplayInfo(i);
+ if channelName == config_BroadcastChannel() then
+ local j = 1;
+ while GetChannelRosterInfo(i, j) do
+ local playerName = GetChannelRosterInfo(i, j);
+ connectedPlayers[playerName] = 1;
+ j = j + 1;
+ end
+ break;
+ end
+ end
+ return connectedPlayers;
+end
+
+local function onChannelJoin(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
+ if config_UseBroadcast() and arg2 and arg9 == config_BroadcastChannel() then
+ local unitName = unitIDToInfo(arg2);
+ connectedPlayers[unitName] = 1;
+ end
+end
+
+local function onChannelLeave(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
+ if config_UseBroadcast() and arg2 and arg9 == config_BroadcastChannel() then
+ local unitName = unitIDToInfo(arg2);
+ connectedPlayers[unitName] = nil;
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Init and helloWorld
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local helloWorlded = false;
+
+-- Send in a broadcast your main informations.
+-- [1] - TRP3 version
+local function helloWorld()
+ if not helloWorlded then
+ Log.log("helloWorld !");
+ helloWorlded = true;
+ end
+end
+
+local function onChannelNotice(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
+ if config_UseBroadcast() and arg9 == config_BroadcastChannel() and arg1 == "YOU_JOINED" then
+ helloWorld();
+ end
+end
+
+local function onMouseOver()
+ if config_UseBroadcast() then
+ if GetChannelName(string.lower(config_BroadcastChannel())) == 0 then
+ JoinChannelByName(string.lower(config_BroadcastChannel()));
+ else
+ -- Case of ReloadUI()
+ helloWorld();
+ end
+ end
+end
+
+Comm.broadcast.init = function()
+ Utils.event.registerHandler("UPDATE_MOUSEOVER_UNIT", onMouseOver);
+ Utils.event.registerHandler("CHAT_MSG_CHANNEL_NOTICE", onChannelNotice);
+ Utils.event.registerHandler("CHAT_MSG_CHANNEL_JOIN", onChannelJoin);
+ Utils.event.registerHandler("CHAT_MSG_CHANNEL_LEAVE", onChannelLeave);
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/configuration.lua b/totalRP3/tags/0.2.7/core/impl/configuration.lua
new file mode 100644
index 000000000..2b91e0508
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/configuration.lua
@@ -0,0 +1,406 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Settings API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- public accessor
+TRP3_API.configuration = {};
+
+-- imports
+local loc = TRP3_API.locale.getText;
+local Utils = TRP3_API.utils;
+local Config = TRP3_API.configuration;
+local _G, tonumber, math, tinsert, type, assert, tostring, pairs, sort, strconcat = _G, tonumber, math, tinsert, type, assert, tostring, pairs, table.sort, strconcat;
+local numberToHexa, hexaToNumber = Utils.color.numberToHexa, Utils.color.hexaToNumber;
+local CreateFrame = CreateFrame;
+local getLocaleText = TRP3_API.locale.getLocaleText;
+local getLocales = TRP3_API.locale.getLocales;
+local getCurrentLocale = TRP3_API.locale.getCurrentLocale;
+local setTooltipForFrame = TRP3_API.ui.tooltip.setTooltipForSameFrame;
+local setupListBox = TRP3_API.ui.listbox.setupListBox;
+local registerMenu, selectMenu = TRP3_API.navigation.menu.registerMenu, TRP3_API.navigation.menu.selectMenu;
+local registerPage, setPage = TRP3_API.navigation.page.registerPage, TRP3_API.navigation.page.setPage;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Configuration methods
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+if TRP3_Configuration == nil then
+ TRP3_Configuration = {};
+end
+
+local defaultValues = {};
+local configHandlers = {};
+
+local function registerHandler(key, callback)
+ assert(defaultValues[key] ~= nil, "Unknown config key: " .. tostring(key));
+ if not configHandlers[key] then
+ configHandlers[key] = {};
+ end
+ tinsert(configHandlers[key], callback);
+end
+
+Config.registerHandler = function (key, callback)
+ if type(key) == "table" then
+ for _, k in pairs(key) do
+ registerHandler(k, callback);
+ end
+ else
+ registerHandler(key, callback);
+ end
+end
+
+local function setValue(key, value)
+ assert(defaultValues[key] ~= nil, "Unknown config key: " .. tostring(key));
+ local old = TRP3_Configuration[key];
+ TRP3_Configuration[key] = value;
+ if configHandlers[key] and old ~= value then
+ for _, callback in pairs(configHandlers[key]) do
+ callback(key, value);
+ end
+ end
+end
+Config.setValue = setValue;
+
+local function getValue(key)
+ assert(defaultValues[key] ~= nil, "Unknown config key: " .. tostring(key));
+ return TRP3_Configuration[key];
+end
+Config.getValue = getValue;
+
+local function registerConfigKey(key, defaultValue)
+ assert(type(key) == "string" and defaultValue ~= nil, "Must be a string key and a not nil default value.");
+ assert(not defaultValues[key], "Config key already registered: " .. tostring(key));
+ defaultValues[key] = defaultValue;
+ if TRP3_Configuration[key] == nil then
+ setValue(key, defaultValue);
+ end
+end
+Config.registerConfigKey = registerConfigKey;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Configuration builder
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local GENERATED_WIDGET_INDEX = 0;
+
+local function buildConfigurationPage(structure)
+ local lastWidget = nil;
+ local marginLeft = structure.marginLeft or 5;
+ for index, element in pairs(structure.elements) do
+ local widget = element.widget or CreateFrame("Frame", element.widgetName or ("TRP3_ConfigurationWidget"..GENERATED_WIDGET_INDEX), structure.parent, element.inherit);
+ widget:SetParent(structure.parent);
+ widget:ClearAllPoints();
+ widget:SetPoint("LEFT", structure.parent, "LEFT", marginLeft + (element.marginLeft or 5), 0);
+ if lastWidget ~= nil then
+ widget:SetPoint("TOP", lastWidget, "BOTTOM", 0, element.marginTop or 0);
+ else
+ widget:SetPoint("TOP", structure.parent, "TOP", 0, element.marginTop or 0);
+ end
+
+ -- Titles
+ if element.title then
+ if _G[widget:GetName().."Title"] then
+ _G[widget:GetName().."Title"]:SetText(element.title);
+ elseif element.title and _G[widget:GetName().."Text"] then
+ _G[widget:GetName().."Text"]:SetText(element.title);
+ end
+ end
+
+ -- Help
+ if _G[widget:GetName().."Help"] then
+ local help = _G[widget:GetName().."Help"];
+ if element.help then
+ help:Show();
+ setTooltipForFrame(help, "RIGHT", 0, 5, element.title, element.help);
+ else
+ help:Hide();
+ end
+ end
+
+ -- Specific for Dropdown
+ if _G[widget:GetName().."DropDown"] then
+ local dropDown = _G[widget:GetName().."DropDown"];
+ if element.configKey then
+ if not element.listCallback then
+ element.listCallback = function(value)
+ setValue(element.configKey, value);
+ end
+ end
+ end
+ setupListBox(
+ dropDown,
+ element.listContent or {},
+ element.listCallback,
+ element.listDefault or "",
+ element.listWidth or 134,
+ element.listCancel
+ );
+ if element.configKey and not element.listDefault then
+ dropDown:SetSelectedValue(getValue(element.configKey));
+ end
+ end
+
+ -- Specific for Color picker
+ if _G[widget:GetName().."Picker"] then
+ if element.configKey then
+ local button = _G[widget:GetName().."Picker"];
+ button.setColor(hexaToNumber(getValue(element.configKey)));
+ button.onSelection = function(red, green, blue)
+ if red and green and blue then
+ local hexa = strconcat(numberToHexa(red), numberToHexa(green), numberToHexa(blue))
+ setValue(element.configKey, hexa);
+ else
+ button.setColor(hexaToNumber(defaultValues[element.configKey]));
+ end
+ end;
+ end
+ end
+
+ -- Specific for Button
+ if _G[widget:GetName().."Button"] then
+ local button = _G[widget:GetName().."Button"];
+ if element.callback then
+ button:SetScript("OnClick", element.callback);
+ end
+ button:SetText(element.text or "");
+ end
+
+ -- Specific for EditBox
+ if _G[widget:GetName().."Box"] then
+ local box = _G[widget:GetName().."Box"];
+ if element.configKey then
+ box:SetScript("OnTextChanged", function(self)
+ local value = self:GetText();
+ setValue(element.configKey, value);
+ end);
+ box:SetText(tostring(getValue(element.configKey)));
+ end
+ box:SetNumeric(element.numeric);
+ box:SetMaxLetters(element.maxLetters or 0);
+ local boxTitle = _G[widget:GetName().."BoxText"];
+ if boxTitle then
+ boxTitle:SetText(element.boxTitle);
+ end
+ end
+
+ -- Specific for Check
+ if _G[widget:GetName().."Check"] then
+ local box = _G[widget:GetName().."Check"];
+ if element.configKey then
+ box:SetScript("OnClick", function(self)
+ setValue(element.configKey, self:GetChecked());
+ end);
+ box:SetChecked(getValue(element.configKey));
+ end
+ end
+
+ -- Specific for Sliders
+ if _G[widget:GetName().."Slider"] then
+ local slider = _G[widget:GetName().."Slider"];
+ local text = _G[widget:GetName().."SliderValText"];
+ local min = element.min or 0;
+ local max = element.max or 100;
+
+ slider:SetMinMaxValues(min, max);
+ _G[widget:GetName().."SliderLow"]:SetText(min);
+ _G[widget:GetName().."SliderHigh"]:SetText(max);
+ slider:SetValueStep(element.step);
+ slider:SetObeyStepOnDrag(element.integer);
+
+ local onChange = function(self, value)
+ if element.integer then
+ value = math.floor(value);
+ end
+ text:SetText(value);
+ if element.configKey then
+ setValue(element.configKey, value);
+ end
+ end
+ slider:SetScript("OnValueChanged", onChange);
+
+ if element.configKey then
+ slider:SetValue(tonumber(getValue(element.configKey)) or min);
+ else
+ slider:SetValue(0);
+ end
+
+ onChange(slider, slider:GetValue());
+ end
+
+ lastWidget = widget;
+ GENERATED_WIDGET_INDEX = GENERATED_WIDGET_INDEX + 1;
+ end
+end
+
+local configurationPageCount = 0;
+local registeredConfiPage = {};
+
+local function registerConfigurationPage(pageStructure)
+ assert(not registeredConfiPage[pageStructure.id], "Already registered page id: " .. pageStructure.id);
+ registeredConfiPage[pageStructure.id] = pageStructure;
+
+ configurationPageCount = configurationPageCount + 1;
+ pageStructure.frame = CreateFrame("Frame", "TRP3_ConfigurationPage" .. configurationPageCount, TRP3_MainFramePageContainer, "TRP3_ConfigurationPage");
+ pageStructure.frame:Hide();
+ pageStructure.parent = _G["TRP3_ConfigurationPage" .. configurationPageCount .. "InnerScrollContainer"];
+ _G["TRP3_ConfigurationPage" .. configurationPageCount .. "Title"]:SetText(pageStructure.pageText);
+
+ registerPage({
+ id = pageStructure.id,
+ frame = pageStructure.frame,
+ });
+
+ registerMenu({
+ id = "main_91_config_" .. pageStructure.id,
+ text = pageStructure.menuText,
+ isChildOf = "main_90_config",
+ onSelected = function() setPage(pageStructure.id); end,
+ });
+
+ buildConfigurationPage(pageStructure);
+end
+Config.registerConfigurationPage = registerConfigurationPage;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- GENERAL SETTINGS
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function changeLocale(newLocale)
+ if newLocale ~= getCurrentLocale() then
+ setValue("AddonLocale", newLocale);
+ TRP3_API.popup.showConfirmPopup(loc("CO_GENERAL_CHANGELOCALE_ALERT"):format(Utils.str.color("g")..getLocaleText(newLocale).."|r"),
+ function()
+ ReloadUI();
+ end);
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- INIT
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+TRP3_API.events.listenToEvent(TRP3_API.events.WORKFLOW_ON_LOAD, function()
+
+ -- Page and menu
+ registerMenu({
+ id = "main_90_config",
+ text = loc("CO_CONFIGURATION"),
+ onSelected = function() selectMenu("main_91_config_main_config_aaa_general") end,
+ });
+
+ TRP3_API.configuration.CONFIG_FRAME_PAGE = {
+ id = "main_config_toolbar",
+ menuText = loc("CO_TOOLBAR"),
+ pageText = loc("CO_TOOLBAR"),
+ elements = {},
+ };
+
+ -- GENERAL SETTINGS INIT
+ -- localization
+ local localeTab = {};
+ for _, locale in pairs(getLocales()) do
+ tinsert(localeTab, {getLocaleText(locale), locale});
+ end
+
+ registerConfigKey("comm_broad_use", true);
+ registerConfigKey("heavy_profile_alert", true);
+ registerConfigKey("new_version_alert", true);
+ registerConfigKey("ui_sounds", true);
+ registerConfigKey("ui_animations", true);
+ registerConfigKey("comm_broad_chan", "xtensionxtooltip2");
+
+ -- Build widgets
+ TRP3_API.configuration.CONFIG_STRUCTURE_GENERAL = {
+ id = "main_config_aaa_general",
+ menuText = loc("CO_GENERAL"),
+ pageText = loc("CO_GENERAL"),
+ elements = {
+ {
+ inherit = "TRP3_ConfigH1",
+ title = loc("CO_GENERAL_LOCALE"),
+ },
+ {
+ inherit = "TRP3_ConfigDropDown",
+ widgetName = "TRP3_ConfigurationGeneral_LangWidget",
+ title = loc("CO_GENERAL_LOCALE"),
+ listContent = localeTab,
+ listCallback = changeLocale,
+ listDefault = getLocaleText(getCurrentLocale()),
+ listWidth = nil,
+ listCancel = true,
+ },
+ {
+ inherit = "TRP3_ConfigH1",
+ title = loc("CO_GENERAL_COM"),
+ },
+ {
+ inherit = "TRP3_ConfigCheck",
+ title = loc("CO_GENERAL_BROADCAST"),
+ configKey = "comm_broad_use",
+ help = loc("CO_GENERAL_BROADCAST_TT"),
+ },
+ {
+ inherit = "TRP3_ConfigEditBox",
+ title = loc("CO_GENERAL_BROADCAST_C"),
+ configKey = "comm_broad_chan",
+ },
+ {
+ inherit = "TRP3_ConfigH1",
+ title = loc("CO_GENERAL_MISC"),
+ },
+ {
+ inherit = "TRP3_ConfigSlider",
+ title = loc("CO_GENERAL_TT_SIZE"),
+ configKey = TRP3_API.ui.tooltip.CONFIG_TOOLTIP_SIZE,
+ min = 6,
+ max = 25,
+ step = 1,
+ integer = true,
+ },
+ {
+ inherit = "TRP3_ConfigCheck",
+ title = loc("CO_GENERAL_HEAVY"),
+ configKey = "heavy_profile_alert",
+ help = loc("CO_GENERAL_HEAVY_TT"),
+ },
+ {
+ inherit = "TRP3_ConfigCheck",
+ title = loc("CO_GENERAL_NEW_VERSION"),
+ configKey = "new_version_alert",
+ help = loc("CO_GENERAL_NEW_VERSION_TT"),
+ },
+ {
+ inherit = "TRP3_ConfigCheck",
+ title = loc("CO_GENERAL_UI_SOUNDS"),
+ configKey = "ui_sounds",
+ help = loc("CO_GENERAL_UI_SOUNDS_TT"),
+ },
+ {
+ inherit = "TRP3_ConfigCheck",
+ title = loc("CO_GENERAL_UI_ANIMATIONS"),
+ configKey = "ui_animations",
+ help = loc("CO_GENERAL_UI_ANIMATIONS_TT"),
+ },
+ }
+ }
+end);
+
+function TRP3_API.configuration.constructConfigPage()
+ TRP3_API.configuration.registerConfigurationPage(TRP3_API.configuration.CONFIG_FRAME_PAGE);
+ TRP3_API.configuration.registerConfigurationPage(TRP3_API.configuration.CONFIG_STRUCTURE_GENERAL);
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/events.lua b/totalRP3/tags/0.2.7/core/impl/events.lua
new file mode 100644
index 000000000..662df1d38
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/events.lua
@@ -0,0 +1,111 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Events API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- Public accessor
+TRP3_API.events = {
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Total RP 3 events
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Workflow
+ WORKFLOW_ON_API = "WORKFLOW_ON_API",
+ WORKFLOW_ON_LOAD = "WORKFLOW_ON_LOAD",
+ WORKFLOW_ON_LOADED = "WORKFLOW_ON_LOADED",
+ WORKFLOW_ON_FINISH = "WORKFLOW_ON_FINISH",
+
+ -- Navigation
+ NAVIGATION_TUTORIAL_REFRESH = "NAVIGATION_TUTORIAL_REFRESH",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Data changed
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ -- General event when a data changed in a profile of a certain unitID (character or companion)
+ -- Arg1 : (optional) unitID or companionFullID
+ -- Arg2 : profile ID
+ -- Arg3 : (optional) Data type : either nil or "characteristics", "about", "misc", "character", "unitID"
+ REGISTER_DATA_UPDATED = "REGISTER_DATA_UPDATED",
+
+ -- Called when you switch from one profile to another
+ -- Use to known when re-compress all of the current profile.
+ -- Arg1 : profile structure
+ REGISTER_PROFILES_LOADED = "REGISTER_PROFILES_LOADED",
+
+ -- Called when a profile is deleted (character or companion)
+ -- Arg1 : Profile ID
+ -- Arg2 : (optional, currently only for characters) A tab containing all the linked unitIDs to the profile
+ REGISTER_PROFILE_DELETED = "REGISTER_PROFILE_DELETED",
+
+ -- Called when as "About" page is shown.
+ -- This is used by the tooltip and the target bar to be refreshed
+ REGISTER_ABOUT_READ = "REGISTER_ABOUT_READ",
+
+ -- Called when a notifications is created/read/removed
+ NOTIFICATION_CHANGED = "NOTIFICATION_CHANGED",
+
+ -- Called when Wow Event UPDATE_MOUSEOVER_UNIT is fired
+ -- Arg1 : Target ID
+ -- Arg2 : Target mode (Character, pet, battle pet ...)
+ MOUSE_OVER_CHANGED = "MOUSE_OVER_CHANGED",
+};
+
+-- TRP3 imports
+local assert, tostring, type, tinsert, pairs = assert, tostring, type, tinsert, pairs;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- EVENT HANDLING
+-- Handles Total RP 3 events system
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local REGISTERED_EVENTS = {};
+
+local function registerEvent(event)
+ assert(event, "Event must be set.");
+ assert(not REGISTERED_EVENTS[event], "Event already registered.");
+ REGISTERED_EVENTS[event] = {};
+end
+
+-- Register main Total RP 3 events
+for event, eventID in pairs(TRP3_API.events) do
+ registerEvent(eventID);
+end
+
+TRP3_API.events.registerEvent = registerEvent;
+
+local function listenToEvent(event, handler)
+ assert(event, "Event must be set.");
+ assert(REGISTERED_EVENTS[event], "Unknown event: " .. tostring(event));
+ assert(handler and type(handler) == "function", "Handler must be a function");
+ tinsert(REGISTERED_EVENTS[event], handler);
+end
+TRP3_API.events.listenToEvent = listenToEvent;
+
+TRP3_API.events.listenToEvents = function(events, handler)
+ assert(events and type(events) == "table", "Events must be a table.");
+ for _, event in pairs(events) do
+ listenToEvent(event, handler);
+ end
+end
+
+TRP3_API.events.fireEvent = function(event, ...)
+ assert(event, "Event must be set.");
+ assert(REGISTERED_EVENTS[event], "Unknown event: " .. tostring(event));
+ for _, handler in pairs(REGISTERED_EVENTS[event]) do
+ handler(...);
+ end
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/globals.lua b/totalRP3/tags/0.2.7/core/impl/globals.lua
new file mode 100644
index 000000000..38c0010cd
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/globals.lua
@@ -0,0 +1,80 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Global variables
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+-- Copyright 2014 Renaud Parize (renaud@parize.me)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local race_loc, race = UnitRace("player");
+local class_loc, class, class_index = UnitClass("player");
+local faction, faction_loc = UnitFactionGroup("player");
+
+-- Public accessor
+TRP3_API = {
+ globals = {
+ empty = {},
+
+ addon_name = "Total RP 3",
+ addon_name_short = "TRP3",
+ addon_name_alt = "TotalRP3",
+ addon_id_length = 15,
+
+ version = 10,
+ version_display = "0.2.7",
+
+ player = UnitName("player"),
+ player_realm = GetRealmName(),
+ player_race_loc = race_loc,
+ player_class_loc = class_loc,
+ player_faction_loc = faction_loc,
+ player_class_index = class_index,
+ player_character = {
+ race = race,
+ class = class,
+ faction = faction
+ },
+
+ clients = {
+ TRP3 = "trp3",
+ MSP = "msp",
+ },
+
+ icons = {
+ default = "TEMP",
+ unknown = "INV_Misc_QuestionMark",
+ profile_default = "INV_Misc_GroupLooking",
+ },
+ }
+}
+
+TRP3_API.globals.build = function()
+ local fullName, realm = UnitFullName("player");
+ assert(realm, "Cannot have realm name information !");
+ TRP3_API.globals.player_realm_id = realm;
+ TRP3_API.globals.player_id = fullName .. "-" .. realm;
+ TRP3_API.globals.player_icon = TRP3_API.ui.misc.getUnitTexture(race, UnitSex("player"));
+
+ -- Build BNet account Hash
+ local bn = select(2, BNGetInfo());
+ if bn then
+ TRP3_API.globals.player_hash = TRP3_API.utils.serial.hashCode(bn);
+ else
+ -- Trial account ..etc.
+ TRP3_API.globals.player_hash = TRP3_API.utils.serial.hashCode(TRP3_API.globals.player_id);
+ end
+end
+
+TRP3_API.globals.addon = LibStub("AceAddon-3.0"):NewAddon(TRP3_API.globals.addon_name);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale.lua
new file mode 100644
index 000000000..f862c63e0
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale.lua
@@ -0,0 +1,160 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Locale system
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+TRP3_API.locale = {}
+
+-- Bindings locale
+BINDING_HEADER_TRP3 = "Total RP 3";
+local BINDINGS_KEYS = {
+ "BINDING_NAME_TRP3_TOGGLE",
+ "BINDING_NAME_TRP3_TOOLBAR_TOGGLE"
+}
+
+local error, pairs, tinsert, assert, table, tostring, GetLocale = error, pairs, tinsert, assert, table, tostring, GetLocale;
+local getText;
+
+local LOCALS = {};
+local DEFAULT_LOCALE = "enUS";
+local effectiveLocal = {};
+local current;
+local localeFont;
+
+function TRP3_API.locale.getLocaleFont()
+ return localeFont;
+end
+
+function TRP3_API.locale.registerLocale(localeStructure)
+ assert(localeStructure and localeStructure.locale and localeStructure.localeText and localeStructure.localeContent, "Usage: localeStructure with locale, localeText and localeContent.");
+ if not LOCALS[localeStructure.locale] then
+ LOCALS[localeStructure.locale] = localeStructure;
+ end
+end
+
+-- Initialize a locale for the addon.
+function TRP3_API.locale.init()
+ -- Register config
+ TRP3_API.configuration.registerConfigKey("AddonLocale", GetLocale());
+ current = TRP3_API.configuration.getValue("AddonLocale");
+ if not LOCALS[current] then
+ current = DEFAULT_LOCALE;
+ end
+ -- Pick the right font
+ if current == "zhCN" then
+ localeFont = "Fonts\\ZYKai_T.TTF";
+ elseif current == "ruRU" then
+ localeFont = "Fonts\\FRIZQT___CYR.TTF";
+ else
+ localeFont = "Fonts\\FRIZQT__.TTF";
+ end
+ TRP3_API.utils.table.copy(effectiveLocal, LOCALS[current].localeContent);
+ for _, bindingKey in pairs(BINDINGS_KEYS) do
+
+ end
+ BINDING_NAME_TRP3_TOGGLE = effectiveLocal["BINDING_NAME_TRP3_TOGGLE"] or LOCALS[DEFAULT_LOCALE].localeContent["BINDING_NAME_TRP3_TOGGLE"];
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = effectiveLocal["BINDING_NAME_TRP3_TOOLBAR_TOGGLE"] or LOCALS[DEFAULT_LOCALE].localeContent["BINDING_NAME_TRP3_TOOLBAR_TOGGLE"];
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Current locale utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Get a sorted list of registered locales ID ("frFR", "enUS" ...).
+function TRP3_API.locale.getLocales()
+ local locales = {};
+ for locale,_ in pairs(LOCALS) do
+ tinsert(locales, locale);
+ end
+ table.sort(locales);
+ return locales;
+end
+
+-- Get the display name of a locale ("Français", "English" ...)
+function TRP3_API.locale.getLocaleText(locale)
+ if LOCALS[locale] then
+ return LOCALS[locale].localeText
+ end
+ return UNKNOWN;
+end
+
+function TRP3_API.locale.getEffectiveLocale()
+ return effectiveLocal;
+end
+
+function TRP3_API.locale.getDefaultLocaleStructure()
+ return LOCALS[DEFAULT_LOCALE];
+end
+
+function TRP3_API.locale.getCurrentLocale()
+ return current;
+end
+
+-- Return the localized text link to this key.
+-- If the key isn't present in the current Locals table, then return the default localization.
+-- If the key is totally unknown from TRP3, then an error will be lifted.
+function getText(key)
+ if effectiveLocal[key] or LOCALS[DEFAULT_LOCALE].localeContent[key] then
+ return effectiveLocal[key] or LOCALS[DEFAULT_LOCALE].localeContent[key];
+ end
+ error("Unknown localization key: ".. tostring(key));
+end
+TRP3_API.locale.getText = getText;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Companion utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+if GetLocale() == "frFR" then
+ -- Thank you French language to be such a pain in the ass.
+ -- It will be less effective on French client. Do I look like I care ? Fuck no. :D
+ function TRP3_API.locale.findPetOwner(lines)
+ if lines[2] then
+ return lines[2]:match("Familier de ([%S%-%P]+)") or lines[2]:match("Familier d'([%S%-%P]+)") or
+ lines[2]:match("Serviteur de ([%S%-%P]+)") or lines[2]:match("Serviteur d'([%S%-%P]+)");
+ end
+ end
+
+ function TRP3_API.locale.findBattlePetOwner(lines)
+ if lines[3] then
+ local master = lines[3]:match("Mascotte de ([%S%-%P]+)") or lines[3]:match("Mascotte d'([%S%-%P]+)");
+ if master:find("%s") then -- Hack for "Mascotte de niveau xxx" ...
+ return nil;
+ end
+ return master;
+ end
+ end
+else
+ local REPLACE_PATTERN, NAME_PATTERN = "%%s", "([%%S%%-%%P]+)";
+ local COMPANION_PET_PATTERN = UNITNAME_TITLE_PET:gsub(REPLACE_PATTERN, NAME_PATTERN);
+ local COMPANION_DEMON_PATTERN = UNITNAME_TITLE_MINION:gsub(REPLACE_PATTERN, NAME_PATTERN);
+
+ function TRP3_API.locale.findPetOwner(lines)
+ if lines[2] then
+ return lines[2]:match(COMPANION_PET_PATTERN) or lines[2]:match(COMPANION_DEMON_PATTERN);
+ end
+ end
+
+ local COMPANION_BATTLE_PET_PATTERN = UNITNAME_TITLE_COMPANION:gsub(REPLACE_PATTERN, NAME_PATTERN);
+
+ function TRP3_API.locale.findBattlePetOwner(lines)
+ if lines[3] then
+ return lines[3]:match(COMPANION_BATTLE_PET_PATTERN);
+ end
+ end
+end
+
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale.xml b/totalRP3/tags/0.2.7/core/impl/locale/locale.xml
new file mode 100644
index 000000000..351bccce9
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale_deDE.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale_deDE.lua
new file mode 100644
index 000000000..5ee4a389c
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale_deDE.lua
@@ -0,0 +1,845 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- German locale
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+-- Translation into German:
+-- Benjamin Strecker - Týberîás @Die Aldor-EU (zerogravityspider@gmx.net)
+-- Enduni ( http://www.curseforge.com/profiles/Enduni/ )
+-- ded88 ( http://www.curseforge.com/profiles/ded88/ )
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local LOCALE_DE = {
+ locale = "deDE",
+ localeText = "Deutsch",
+ localeContent = {
+ ABOUT_TITLE = "Über",
+ BINDING_NAME_TRP3_TOGGLE = "Hauptfenster umschalten",
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = "Werkzeugleiste umschalten", -- Needs review
+ BW_COLOR_CODE = "Farbcode", -- Needs review
+ BW_COLOR_CODE_ALERT = "Falscher hexadezimaler Farbcode!", -- Needs review
+ BW_COLOR_CODE_TT = "Hier kannst du 6 Zeichen hexadezimalen Farbcode einfügen und mit Eingabe bestätigen.", -- Needs review
+ CM_ACTIONS = "Aktionen",
+ CM_APPLY = "Übernehmen",
+ CM_CANCEL = "Abbrechen",
+ CM_CENTER = "Zentriert", -- Needs review
+ CM_CLASS_DEATHKNIGHT = "Todesritter",
+ CM_CLASS_DRUID = "Druide",
+ CM_CLASS_HUNTER = "Jäger",
+ CM_CLASS_MAGE = "Magier",
+ CM_CLASS_MONK = "Mönch",
+ CM_CLASS_PALADIN = "Paladin",
+ CM_CLASS_PRIEST = "Priester",
+ CM_CLASS_ROGUE = "Schurke",
+ CM_CLASS_SHAMAN = "Schamane",
+ CM_CLASS_UNKNOWN = "Unbekannt",
+ CM_CLASS_WARLOCK = "Hexenmeister",
+ CM_CLASS_WARRIOR = "Krieger", -- Needs review
+ CM_CLICK = "Klicken",
+ CM_COLOR = "Farbe",
+ CM_CTRL = "Strg", -- Needs review
+ CM_DRAGDROP = "Drag & Drop", -- Needs review
+ CM_EDIT = "Bearbeiten", -- Needs review
+ CM_IC = "IC",
+ CM_ICON = "Icon",
+ CM_IMAGE = "Bild",
+ CM_L_CLICK = "Links-Klick",
+ CM_LEFT = "Links",
+ CM_LINK = "Link",
+ CM_LOAD = "Laden",
+ CM_MOVE_DOWN = "Nach unten", -- Needs review
+ CM_MOVE_UP = "Nach oben", -- Needs review
+ CM_NAME = "Name",
+ CM_OOC = "OOC",
+ CM_OPEN = "Öffnen",
+ CM_PLAY = "Abspielen", -- Needs review
+ CM_R_CLICK = "Rechts-Klick",
+ CM_REMOVE = "Entfernen",
+ CM_RIGHT = "Rechts", -- Needs review
+ CM_SAVE = "Speichern",
+ CM_SELECT = "Auswählen",
+ CM_SHIFT = "Umstelltaste", -- Needs review
+ CM_SHOW = "Anzeigen",
+ CM_STOP = "Anhalten", -- Needs review
+ CM_UNKNOWN = "Unbekannt",
+ CM_VALUE = "Wert",
+ CO_ANCHOR_BOTTOM = "Unten",
+ CO_ANCHOR_BOTTOM_LEFT = "Unten Links",
+ CO_ANCHOR_BOTTOM_RIGHT = "Unten Rechts",
+ CO_ANCHOR_LEFT = "Links",
+ CO_ANCHOR_RIGHT = "Rechts",
+ CO_ANCHOR_TOP = "Oben",
+ CO_ANCHOR_TOP_LEFT = "Oben Links",
+ CO_ANCHOR_TOP_RIGHT = "Oben Rechts",
+ CO_CHAT = "Chateinstellungen", -- Needs review
+ CO_CHAT_MAIN = "Chathaupteinstellungen", -- Needs review
+ CO_CHAT_MAIN_COLOR = "Benutze eigene Farben für Namen", -- Needs review
+ CO_CHAT_MAIN_EMOTE = "Emoteerkennung", -- Needs review
+ CO_CHAT_MAIN_EMOTE_PATTERN = "Muster zur Emoteerkennung", -- Needs review
+ CO_CHAT_MAIN_EMOTE_USE = "Nutze Emoteerkennung", -- Needs review
+ CO_CHAT_MAIN_EMOTE_YELL = "Keine geschrienen Emotes", -- Needs review
+ CO_CHAT_MAIN_EMOTE_YELL_TT = "Beim Schreien *emote* oder nicht zeigen.", -- Needs review
+ CO_CHAT_MAIN_NAMING = "Benennungsmethode",
+ CO_CHAT_MAIN_NAMING_1 = "Originale Namen beibehalten", -- Needs review
+ CO_CHAT_MAIN_NAMING_2 = "Angepasste Namen verwenden", -- Needs review
+ CO_CHAT_MAIN_NAMING_3 = "Vorname + Nachname",
+ CO_CHAT_MAIN_NPC = "NSC-Spracherkennung", -- Needs review
+ CO_CHAT_MAIN_NPC_PREFIX = "Muster für NSC-Spracherkennung", -- Needs review
+ CO_CHAT_MAIN_NPC_PREFIX_TT = [=[Wenn eine Chatnachricht im Sagen-, Emote- oder Schlachtzugskanal mit diesem Zeichen startet, wird sie als NSC-Nachricht interpretiert.
+
+|cff00ff00Voreingestellt : "|| "
+(ohne die " und mit einem Leerzeichen nach dem Strich)]=], -- Needs review
+ CO_CHAT_MAIN_NPC_USE = "Nutze NSC-Spracherkennung", -- Needs review
+ CO_CHAT_MAIN_OOC = "OOC-Erkennung", -- Needs review
+ CO_CHAT_MAIN_OOC_COLOR = "OOC-Farbe", -- Needs review
+ CO_CHAT_MAIN_OOC_PATTERN = "Muster für OOC-Erkennung", -- Needs review
+ CO_CHAT_MAIN_OOC_USE = "Nutze OOC-Erkennung", -- Needs review
+ CO_CHAT_USE = "Benutze Chatkanäle", -- Needs review
+ CO_CHAT_USE_SAY = "Sagen-Kanal", -- Needs review
+ CO_CONFIGURATION = "Einstellungen",
+ CO_GENERAL = "Allgemeine Einstellungen",
+ CO_GENERAL_BROADCAST = "Broadcast-Kanal nutzen", -- Needs review
+ CO_GENERAL_BROADCAST_C = "Names des Broadcast-Kanals", -- Needs review
+ CO_GENERAL_BROADCAST_TT = "Der Broadcast-Kanal wird für viele Funktionen genutzt. Durch das Deaktivieren werden Funktionen wie die Charakterposition auf der Karte, Abspielen lokaler Klänge usw. deaktivert.", -- Needs review
+ CO_GENERAL_CHANGELOCALE_ALERT = [=[Interface neu laden, um die Sprache jetzt auf %s zu ändern?
+
+Wenn nicht, wird die Sprache beim nächsten Login geändert.]=], -- Needs review
+ CO_GENERAL_COM = "Kommunikation",
+ CO_GENERAL_HEAVY = "Warnung bei überlangem Profil", -- Needs review
+ CO_GENERAL_HEAVY_TT = "Gibt dir einen Warnhinweis, wenn dein Profil eine verträgliche Größe überschreitet.", -- Needs review
+ CO_GENERAL_LOCALE = "Sprache des Addons", -- Needs review
+ CO_GENERAL_MISC = "Verschiedenes",
+ CO_GENERAL_NEW_VERSION = "Aktualisierungshinweis", -- Needs review
+ CO_GENERAL_NEW_VERSION_TT = "Gibt dir einen Hinweis, sobald eine neue Version verfügbar ist.", -- Needs review
+ CO_GENERAL_NOTIF = "Benachrichtigungen",
+ CO_GENERAL_TT_SIZE = "Textgröße des Informationstooltips", -- Needs review
+ CO_GENERAL_UI_ANIMATIONS = "Interface-Animationen", -- Needs review
+ CO_GENERAL_UI_ANIMATIONS_TT = "Aktiviert die Interface-Animationen.", -- Needs review
+ CO_GENERAL_UI_SOUNDS = "Interface-Klänge", -- Needs review
+ CO_GENERAL_UI_SOUNDS_TT = "Aktivert die Interface-Klänge (beim Öffnen von Fenstern, Wechseln zwischen Reitern und Klicken auf Schaltflächen).", -- Needs review
+ CO_GLANCE_LOCK = "Leiste fixieren", -- Needs review
+ CO_GLANCE_LOCK_TT = "Verhindert, dass die Leiste verschoben wird.", -- Needs review
+ CO_GLANCE_MAIN = "\"Auf den ersten Blick\"-Leiste", -- Needs review
+ CO_GLANCE_PRESET_TRP2 = "Benutze Positionen im Total RP 2 Stil",
+ CO_GLANCE_PRESET_TRP2_BUTTON = "Benutzen",
+ CO_GLANCE_PRESET_TRP2_HELP = "Verknüpfung, um die Leiste im TRP2-Stil zu konfigurieren – am rechten Rand des WoW-Zielfensters.", -- Needs review
+ CO_GLANCE_PRESET_TRP3 = "Benutze Positionen im Total RP 3 Stil",
+ CO_GLANCE_PRESET_TRP3_HELP = "Verknüpfung um die Zeile im TRP3 Stil aufzusetzen - Am unteren Rand des TRP3 Zielfensters.",
+ CO_GLANCE_RESET_TT = "Setze die Leiste auf die untere linke Position des Ankerfensters zurück.", -- Needs review
+ CO_GLANCE_TT_ANCHOR = "Ankerpunkt des Tooltips", -- Needs review
+ CO_MINIMAP_BUTTON = "Minimap Button",
+ CO_MINIMAP_BUTTON_FRAME = "Ankerfenster",
+ CO_MINIMAP_BUTTON_FRAME_TT = [=[Gibt an, welcher Rahmen dem Button übergeordnet ist.
+
+|cff00ff00To move the button relatively from this frame you can drag & drop the button.]=], -- Needs review
+ CO_MINIMAP_BUTTON_LOCK = "Position fixieren",
+ CO_MINIMAP_BUTTON_LOCK_TT = "Verhindert, dass der Button verschoben wird.", -- Needs review
+ CO_MINIMAP_BUTTON_RESET = "Position zurücksetzen",
+ CO_MINIMAP_BUTTON_RESET_BUTTON = "Zurücksetzen",
+ CO_MINIMAP_BUTTON_RESET_TT = "Setzt den Button an die untere linke Ecke des Ankerfenster zurück.",
+ COM_LIST = "Liste aller Befehle:", -- Needs review
+ CO_MODULES = "Modulstatus", -- Needs review
+ CO_MODULES_DISABLE = "Deaktiviere Modul",
+ CO_MODULES_ENABLE = "Aktiviere Modul",
+ CO_MODULES_ID = "Modul ID: %s",
+ CO_MODULES_SHOWERROR = "Zeige Fehler",
+ CO_MODULES_STATUS = "Status: %s",
+ CO_MODULES_STATUS_0 = "Fehlende Abhängigkeiten",
+ CO_MODULES_STATUS_1 = "Geladen",
+ CO_MODULES_STATUS_2 = "Deaktivert",
+ CO_MODULES_STATUS_3 = "Total RP 3 Aktualisierung benötigt", -- Needs review
+ CO_MODULES_STATUS_4 = "Fehler bei der Initialisierung", -- Needs review
+ CO_MODULES_STATUS_5 = "Fehler beim Start",
+ CO_MODULES_TT_DEP = "%s- %s (version %s)|r", -- Needs review
+ CO_MODULES_TT_DEPS = "Abhängigkeiten",
+ CO_MODULES_TT_ERROR = [=[
+|cffff0000Fehler:|r
+%s]=], -- Needs review
+ CO_MODULES_TT_NONE = "Keine Abhängigkeiten",
+ CO_MODULES_TT_TRP = "%sFür Total RP 3 build %s minimum.|r",
+ CO_MODULES_TUTO = [=[Ein Modul ist eine unabhängige Funktion, die aktiviert oder deaktiviert werden kann.
+
+Möglicher Status:
+|cff00ff00Geladen:|r Modul aktiviert und geladen.
+|cff999999Deaktiviert:|r Modul deaktiviert.
+|cffff9900Fehlende Abhängigkeiten:|r Einige Abhängigkeiten sind nicht geladen/verfügbar.
+|cffff9900TRP Update benötigt:|r Diese Modul benötigt eine aktueller Version von TRP3.
+|cffff0000Fehler beim Inizialisieren oder Starten:|r Der Start des Moduls hat nicht funktioniert. Das Modul würde sicher Fehler verursachen!
+
+|cffff9900Wenn ein Modul deaktivert wird muss das UI neu geladen werden!]=], -- Needs review
+ CO_MODULES_VERSION = "Version: %s",
+ COM_RESET_RESET = "Die Position des Fensters wurde zurückgesetzt.", -- Needs review
+ COM_RESET_USAGE = "Hinweis: |cff00ff00/trp3 reset frames|r, um alle Fensterpositionen zurückzusetzen.", -- Needs review
+ CO_MSP = "Mary Sue Protocol",
+ CO_MSP_T3 = "Benutze nur Template 3",
+ CO_MSP_T3_TT = "Selbst, wenn du ein anderes \"Über\"-Template auswählst, wird immer Template 3 genutzt, um MSP-Kompatibilität zu gewährleisten.", -- Needs review
+ COM_SWITCH_USAGE = "Hinweis: |cff00ff00/trp3 switch main|r, um das Hauptfenster umzuschalten oder |cff00ff00/trp3 switch toolbar|r, um die Werkzeugleiste umzuschalten.", -- Needs review
+ CO_NOTIF_DOUBLE = "Benachrichtigung + Chatnachricht",
+ CO_NOTIF_NO = "Keine Benachrichtigung",
+ CO_NOTIF_SIMPLE = "Benachrichtigung",
+ CO_NOTIF_TRIPLE = "Benachrichtigung + Chatnachricht + Raidalarm",
+ CO_REGISTER = "Einstellungen registrieren",
+ CO_REGISTER_ABOUT_VOTE = "Benutze Bewertungssystem", -- Needs review
+ CO_REGISTER_ABOUT_VOTE_TT = "Aktiviert das Bewertungssystem, welches dir erlaubt, die Beschreibung von Charakteren als positiv oder negativ zu bewerten. Hierdurch kannt auch dein Charakter bewertet werden!", -- Needs review
+ CO_REGISTER_AUTO_ADD = "Neue Spieler automatisch hinzufügen",
+ CO_REGISTER_AUTO_ADD_TT = "Automatisch neue Spieler, denen du begegnest, zum Register hinzufügen.", -- Needs review
+ CO_TARGETFRAME = "Zielfentereinstellungen", -- Needs review
+ CO_TARGETFRAME_ICON_SIZE = "Icongröße",
+ CO_TARGETFRAME_USE = "Anzeigebedingungen", -- Needs review
+ CO_TARGETFRAME_USE_1 = "Immer",
+ CO_TARGETFRAME_USE_2 = "Nur wenn IC",
+ CO_TARGETFRAME_USE_3 = "Niemals (Deaktiviert)",
+ CO_TARGETFRAME_USE_TT = "Gibt an, unter welchen Bedingungen das Zielfenster am gewählten Ziel gezeigt werden soll.", -- Needs review
+ CO_TOOLBAR = "Fenstereinstellungen", -- Needs review
+ CO_TOOLBAR_CONTENT = "Toolbareinstellungen", -- Needs review
+ CO_TOOLBAR_CONTENT_CAPE = "Umhang an/aus",
+ CO_TOOLBAR_CONTENT_HELMET = "Helm an/aus",
+ CO_TOOLBAR_CONTENT_RPSTATUS = "Charakterstatus (IC/OOC)",
+ CO_TOOLBAR_CONTENT_STATUS = "Spielerstatus (AFK/DND)",
+ CO_TOOLBAR_ICON_SIZE = "Icongröße",
+ CO_TOOLBAR_MAX = "Maximale Icons pro Zeile",
+ CO_TOOLBAR_MAX_TT = "Auf 1 stellen wenn du die Leiste vertikal angezeigt haben möchtest!",
+ CO_TOOLTIP = "Tooltipeinstellungen", -- Needs review
+ CO_TOOLTIP_ANCHOR = "Ankerpunkt",
+ CO_TOOLTIP_ANCHORED = "Ankerfenster",
+ CO_TOOLTIP_CHARACTER = "Charaktertooltip", -- Needs review
+ CO_TOOLTIP_CLIENT = "Zeige Client",
+ CO_TOOLTIP_COMBAT = "Während des Kampfs verbergen", -- Needs review
+ CO_TOOLTIP_COMMON = "Standardeinstellungen", -- Needs review
+ CO_TOOLTIP_CURRENT = "Zeige \"aktuelle\" Informationen",
+ CO_TOOLTIP_CURRENT_SIZE = "Maximale Länge von \"aktuellen\" Informationen", -- Needs review
+ CO_TOOLTIP_FT = "Zeige vollen Titel",
+ CO_TOOLTIP_GUILD = "Zeige Gildeninformationen", -- Needs review
+ CO_TOOLTIP_HIDE_ORIGINAL = "Verstecke Originaltooltip", -- Needs review
+ CO_TOOLTIP_ICONS = "Zeige Icons",
+ CO_TOOLTIP_MAINSIZE = "Hauptschriftgröße",
+ CO_TOOLTIP_NOTIF = "Zeige Benachrichtigungen",
+ CO_TOOLTIP_NOTIF_TT = "Die Benachrichtigungszeile enthält die Clientversion, den Marker für ungelesene Beschreibungen und die \"Auf den Ersten Blick\" Leiste.", -- Needs review
+ CO_TOOLTIP_OWNER = "Zeige Besitzer",
+ CO_TOOLTIP_PETS = "Begleitertooltip", -- Needs review
+ CO_TOOLTIP_PETS_INFO = "Zeige Begleiterinformationen", -- Needs review
+ CO_TOOLTIP_PROFILE_ONLY = "Nur benutzen, wenn das Ziel ein Profil hat", -- Needs review
+ CO_TOOLTIP_RACE = "Zeige Rasse, Klasse und Level",
+ CO_TOOLTIP_REALM = "Zeige Server", -- Needs review
+ CO_TOOLTIP_RELATION = "Zeige Beziehungsfarbe", -- Needs review
+ CO_TOOLTIP_RELATION_TT = "Fügt dem Rand des Charaktertooltips eine Farbe hinzu, um die Beziehung zu repräsentieren.", -- Needs review
+ CO_TOOLTIP_SPACING = "Zeige Leerzeile",
+ CO_TOOLTIP_SPACING_TT = "Zeigt Leerzeilen, um den Tooltip dem Tooltip von MyRoleplay ähnlich zu sehen.", -- Needs review
+ CO_TOOLTIP_SUBSIZE = "Sekundäre Schriftgöße",
+ CO_TOOLTIP_TARGET = "Zeige Ziel",
+ CO_TOOLTIP_TERSIZE = "Tertiäre Schriftgröße",
+ CO_TOOLTIP_TITLE = "Zeige Titel",
+ CO_TOOLTIP_USE = "Benutze die Tooltips für Charaktere/Begleiter",
+ CO_WIM = "|cffff9900Flüsterkanäle deaktiviert.", -- Needs review
+ CO_WIM_TT = "Du nutzt |cff00ff00WIM|r, die Nutzung wurde aus Kompatibilitätsgründen deaktiviert",
+ DB_NOTIFICATIONS = "Benachrichtigunganzeige",
+ DB_NOTIFICATIONS_ALL = "Alle Benachrichtigungstypen",
+ DB_NOTIFICATIONS_CLEAR = "Alle Benachrichtigungen entfernen",
+ DB_NOTIFICATIONS_NO = "Du hast keine Benachrichtigungen",
+ DB_STATUS = "Status",
+ DB_STATUS_CURRENTLY = "Aktuelles (IC)",
+ DB_STATUS_CURRENTLY_COMMON = "Der Status wird im Tooltip deines Charakters angezeigt. Halte dich hier kurz, knapp und eindeutig, da |cffff9900standartmäßig alle TRP3 Nutzer nur die ersten 140 Zeichen sehen können!",
+ DB_STATUS_CURRENTLY_OOC = "Andere Informationen (OOC)",
+ DB_STATUS_CURRENTLY_OOC_TT = "Hier kannst du Wichtiges über dich als Spieler oder andere OOC Informationen eintragen.", -- Needs review
+ DB_STATUS_CURRENTLY_TT = "Hier kannst du Wichtiges über deinen Charakter angeben.", -- Needs review
+ DB_STATUS_RP = "Charakterstatus", -- Needs review
+ DB_STATUS_RP_EXP = "Erfahrener Rollenspieler",
+ DB_STATUS_RP_EXP_TT = [=[Zeigt an, dass du ein erfahrener Rollenspieler bist.
+Zeigt kein spezielles Icon auf deinem Tooltip an.]=], -- Needs review
+ DB_STATUS_RP_IC = "In Character (IC)", -- Needs review
+ DB_STATUS_RP_IC_TT = [=[Die spielst diesen Charakter aktuell aus.
+Dein gesamtes Handeln wird bewertet, als ob dein Charakter diese Aktionen ausführt.]=], -- Needs review
+ DB_STATUS_RP_OOC = "Out of Character (OOC)", -- Needs review
+ DB_STATUS_RP_OOC_TT = [=[Du spielst diesen Charakter aktuell nicht aus.
+Dein Handeln wird nicht mit dem Charakter in Verbindung gebracht.]=],
+ DB_STATUS_RP_VOLUNTEER = "Rollenspiellehrer", -- Needs review
+ DB_STATUS_RP_VOLUNTEER_TT = "Diese Auswahl zeigt mithilfe eines Icons auf deinem Tooltip an, dass du Rollenspielanfängern Hilfestellung gibst.", -- Needs review
+ DB_STATUS_XP = "Rollenspielerfahrung",
+ DB_STATUS_XP_BEGINNER = "Rollenspielanfänger", -- Needs review
+ DB_STATUS_XP_BEGINNER_TT = "Diese Auswahl zeigt mithilfe eines Icons auf deinem Tooltip an, dass du noch Rollenspielanfänger bist.", -- Needs review
+ DB_TUTO_1 = [=[|cffffff00Der Charakter Status|r zeigt an, ob du deinen Charakter momentan ausspielst oder nicht.
+
+|cffffff00Die Rollenspielerfahrung|r gibt an, ob du ein blutiger Anfänger oder ein erfahrener Rollenspieler bist, der gerne Neulingen hilft!
+
+|cff00ff00Diese Informationen werden im Tooltip deines Charakters angezeigt.]=], -- Needs review
+ DB_TUTO_2 = [=[Einige Ereignisse erzeugen Benachrichtigungen. Diese sind ein schneller Weg um zu sehen, was in Total RP 3 passiert.
+
+Alle Benachrichtigungen lassen sich unter |cffff9900Allgemeine Einstellungen|r einstellen.]=], -- Needs review
+ GEN_NEW_VERSION_AVAILABLE = [=[Eine neue Version von Total RP 3 ist verfügbar.
+
+|cffff0000Deine Version : %s
+|c0000ff00Neue Version %s|r
+
+|cffff9900Wir empfehlen dir, immer die aktuelleste Version zu verwenden.|r
+
+Diese Meldung wird nur einmal pro Sitzung angezeigt und kann in den Einstellungen abgeschaltet werden.]=], -- Needs review
+ GEN_VERSION = "Version: %s (Build %s)",
+ GEN_WELCOME_MESSAGE = "Danke, dass du Total RP 3 (v %s) verwendest! Viel Spaß!", -- Needs review
+ MM_SHOW_HIDE_MAIN = "Zeige/verstecke das Hauptfenster", -- Needs review
+ MM_SHOW_HIDE_MOVE = "Icon bewegen",
+ MM_SHOW_HIDE_SHORTCUT = "Zeig/verstecke die Toolbar", -- Needs review
+ NPC_TALK_SAY_PATTERN = "sagt: ",
+ NPC_TALK_WHISPER_PATTERN = "flüstert: ",
+ NPC_TALK_YELL_PATTERN = "schreit: ",
+ PR_CO_BATTLE = "Begleiter",
+ PR_CO_COUNT = "%s Haustiere/Reittiere an dieses Profil gebunden.",
+ PR_CO_EMPTY = "Kein Begleiterprofil", -- Needs review
+ PR_CO_MASTERS = "Meister",
+ PR_CO_NEW_PROFILE = "Neues Begleiterprofil", -- Needs review
+ PR_CO_PET = "Tier",
+ PR_CO_PROFILE_DETAIL = "Dieses Profil ist aktuell gebunden an", -- Needs review
+ PR_CO_PROFILE_HELP = [=[Ein Profil enthält alle Informationen über ein |cffffff00"Haustier/Begleiter"|r als |cff00ff00Rollenspiel Charakter|r.
+
+Ein Begleiterprofil kann an folgende Begleiterarten gebunden werden:
+- Ein Kampfhaustier |cffff9900(nur wenn es umbennant wurde)|r
+- Einen Jägerbegleiter
+- Einen Diener eines Hexenmeisters
+- Einen Magierelementar
+- Einen Ghul eines Todesritters |cffff9900(siehe unten)|r
+
+Genau wie bei einem Charakterprofil kann ein |cff00ff00Begleiterproful|r mit |cffffff00verschiedenen Haustieren|r verbunden werden. Genauso kannst du für dein |cffffff00Haustier|r einfach durch die verschiedenen Profile schalten.
+
+|cffff9900Ghule:|r Für einen Ghul musst du das Profil bei jeder Beschwörung neu auswählen, da dessen Spielname zufällig vergeben wird!]=], -- Needs review
+ PR_CO_PROFILE_HELP2 = [=[Hier klicken um eine neues Begleiterprofil anzulegen.
+
+|cff00ff00Um ein Profil einem Haustier zu zuweisen, beschwöre einfach dein Haustier/Begleiter, wähle es aus und benutze das Zielfenster um es einem Profil zu zuweisen (oder ein neues Profil zu erstellen).|r]=],
+ PR_CO_PROFILEMANAGER_DELETE_WARNING = [=[Bist du sicher, dass du dieses Begleiterprofil %s löschen willst?
+Diese Aktion kann nicht rückgängig gemacht werden und alle TRP3 Informationen, die damit zusammenhängen, werden unwiderruflich zerstört!]=], -- Needs review
+ PR_CO_PROFILEMANAGER_DUPP_POPUP = [=[Bitte gibt einen Namen für das neue Profil ein.
+Der Name darf nicht leer sein.
+
+Diese Kopie ändert nicht die Bindung deines Haustieres/Reittieres zu %s.]=],
+ PR_CO_PROFILEMANAGER_EDIT_POPUP = [=[Bitte gib einen Namen für das Profil %s ein.
+Der Name darf nicht leer sein.
+
+Das Ändern des Namens ändert nicht die Verbindung des Profils mit deinem Haustier/Reittier.]=], -- Needs review
+ PR_CO_PROFILEMANAGER_TITLE = "Begleiterprofile", -- Needs review
+ PR_CO_UNUSED_PROFILE = "Dieses Profil ist aktuell nicht an ein Haustier oder Reittier gebunden.",
+ PR_CO_WARNING_RENAME = [=[|cffff0000Warnung:|r Es wird dringend empfohlen, dein Haustier umzubenennen, bevor du es mit einem Profil verbindest.
+
+Trotzdem verbinden?]=], -- Needs review
+ PR_CREATE_PROFILE = "Profil erstellen", -- Needs review
+ PR_DELETE_PROFILE = "Profil löschen",
+ PR_DUPLICATE_PROFILE = "Profil kopieren",
+ PR_IMPORT_CHAR_TAB = "Charakterimporteur", -- Needs review
+ PR_IMPORT_EMPTY = "Kein importierbares Profil",
+ PR_IMPORT_IMPORT_ALL = "Alles importieren", -- Needs review
+ PR_IMPORT_PETS_TAB = "Begleiterimporteur", -- Needs review
+ PR_IMPORT_WILL_BE_IMPORTED = "Wird importiert", -- Needs review
+ PR_PROFILE = "Profil",
+ PR_PROFILE_CREATED = "Profile %s erstellt.",
+ PR_PROFILE_DELETED = "Profile %s gelöscht.",
+ PR_PROFILE_DETAIL = "Dieses Profil ist aktuell an diese WoW Charaktere gebunden", -- Needs review
+ PR_PROFILE_HELP = [=[Ein Profil enthält alle Informationen über einen |cffffff00"Charakter"|r als |cff00ff00Rollenspielcharakter|r.
+
+Ein realer |cffffff00"WoW Charakter"|r kann nur an ein Profil gleichzeitig gebunden sein, kann aber zwischen verschiedenen Profilen hin und her schalten.
+
+Du kannst auch mehrere |cffffff00"WoW Charaktere"|r an dasselbe |cff00ff00Profil|r binden!]=], -- Needs review
+ PR_PROFILE_LOADED = "Das Profil %s ist geladen.",
+ PR_PROFILEMANAGER_ACTIONS = "Aktionen",
+ PR_PROFILEMANAGER_ALREADY_IN_USE = "Der Profilname %s ist nicht verfügbar.",
+ PR_PROFILEMANAGER_COUNT = "%s WoW Charakter/e an dieses Profil gebunden.",
+ PR_PROFILEMANAGER_CREATE_POPUP = [=[Gib bitte einen Namen für das neue Profil ein.
+Die Namenszeile darf nicht leer sein.]=],
+ PR_PROFILEMANAGER_CURRENT = "Aktuelles Profil",
+ PR_PROFILEMANAGER_DELETE_WARNING = [=[Bist du sicher, dass du das Profil %s? löschen willst
+Diese Aktion kann nicht rückgängig gemacht werden und alle TRP3 Informationen, die damit verbunden sind, werden unwiderruflich gelöscht!]=], -- Needs review
+ PR_PROFILEMANAGER_DUPP_POPUP = [=[Gib bitte einen Namen für das neue Profil ein.
+Die Namenszeile darf nicht leer sein.
+
+Diese Kopie ändert nicht die Bindung zu %s.]=],
+ PR_PROFILEMANAGER_EDIT_POPUP = [=[Gib bitte einen neuen Namen für das Profil %s ein.
+Die Namenszeile darf nicht leer sein.
+
+Die änderung des Namens verändert nicht die Verbindung zwischen dem Profil und den Charakteren.]=],
+ PR_PROFILEMANAGER_RENAME = "Profil umbenennen",
+ PR_PROFILEMANAGER_SWITCH = "Profil auswählen",
+ PR_PROFILEMANAGER_TITLE = "Charakterprofile", -- Needs review
+ PR_PROFILES = "Profile",
+ PR_UNUSED_PROFILE = "Dieses Profil ist aktuell an keinen WoW Charakter gebunden.",
+ REG_COMPANION = "Begleiter",
+ REG_COMPANION_INFO = "Information",
+ REG_COMPANION_NAME = "Name",
+ REG_COMPANION_NAME_COLOR = "Namensfarbe",
+ REG_COMPANION_PAGE_TUTO_C_1 = "Consult",
+ REG_COMPANION_PAGE_TUTO_E_1 = [=[Das ist die|cff00ff00 Hauptinformation deines Begleiters|r.
+
+All diese Informationen werden |cffff9900im Tooltip deines Begleiters angezeigt|r.]=],
+ REG_COMPANION_PAGE_TUTO_E_2 = [=[Das ist die|cff00ff00 Beschreibung deines Charakters|r.
+
+Es ist nicht auf eine |cffff9900Physische Beschreibung|r limitiert. Deute hier ruhig Teile seiner |cffff9900Hintergrundgeschichte|r oder Details über seine |cffff9900Persönlichkeit|r an.
+
+Es gibt unzählige Wege, die Beschreibung zu personalisieren.
+Du kannst eine |cffffff00Hintergrundtextur|r für die Beschreibung aussuchen. Du kannst ebenfalls die Formatierungstools verwenden, um Dinge wie |cffffff00Schriftgröße, Farbe und Textausrichtung|r anzupassen.
+Diese Tools erlauben dir auch das Einfügen von |cffffff00Bildern, Icons oder Links zu externen Internetseiten|r.]=], -- Needs review
+ REG_COMPANION_PROFILES = "Begleiterprofile", -- Needs review
+ REG_COMPANIONS = "Begleiter",
+ REG_COMPANION_TF_BOUND_TO = "Profil auswählen",
+ REG_COMPANION_TF_CREATE = "Neues Profil erstellen", -- Needs review
+ REG_COMPANION_TF_NO = "Kein Profil",
+ REG_COMPANION_TF_OPEN = "Seite öffnen",
+ REG_COMPANION_TF_OWNER = "Owner: %s", -- Needs review
+ REG_COMPANION_TF_PROFILE = "Begleiterprofil", -- Needs review
+ REG_COMPANION_TF_PROFILE_MOUNT = "Reittierprofil", -- Needs review
+ REG_COMPANION_TF_UNBOUND = "Profil abwählen",
+ REG_COMPANION_TITLE = "Titel",
+ REG_DELETE_WARNING = [=[Bist du sicher, dass du %s's Profil löschen möchtest?
+]=], -- Needs review
+ REG_IGNORE_TOAST = "Charakter wird ignoriert", -- Needs review
+ REG_LIST_ACTIONS_MASS = "Aktion auf %s ausgewählte Profile",
+ REG_LIST_ACTIONS_MASS_IGNORE = "Profile ignorieren",
+ REG_LIST_ACTIONS_MASS_IGNORE_C = [=[Diese Aktion wird |cff00ff00%s Charaktere der Ignorieren Liste hinzufügen.
+
+Optional kann hier ein Grund angegeben werden. Es handelt sich um eine persönliche Notiz, die nur zur Erinnerung dient.]=], -- Needs review
+ REG_LIST_ACTIONS_MASS_REMOVE = "Profile entfernen",
+ REG_LIST_ACTIONS_MASS_REMOVE_C = "Diese Aktion wird |cff00ff00%s ausgewählte/s Profil/e löschen|r.",
+ REG_LIST_ACTIONS_PURGE = "Register entfernen",
+ REG_LIST_ACTIONS_PURGE_ALL = "Alle Profile löschen",
+ REG_LIST_ACTIONS_PURGE_ALL_C = [=[Dies wird alle Profile und verlinkten Charaktere löschen.
+
+|cff00ff00%s Charaktere.]=],
+ REG_LIST_ACTIONS_PURGE_ALL_COMP_C = [=[Dies wird alle deine Begleiter löschen.
+
+|cff00ff00%s Begleiter.]=],
+ REG_LIST_ACTIONS_PURGE_COUNT = "%s Profile werden gelöscht.",
+ REG_LIST_ACTIONS_PURGE_EMPTY = "Keine Profile zum Löschen.", -- Needs review
+ REG_LIST_ACTIONS_PURGE_IGNORE = "Profile von ignorierten Charakteren",
+ REG_LIST_ACTIONS_PURGE_IGNORE_C = [=[Dies wird alle Profile, die mit ignorierten Charakteren verbunden sind, löschen.
+
+|cff00ff00%s]=], -- Needs review
+ REG_LIST_ACTIONS_PURGE_TIME = "Seit 1 Monat nicht mehr gesehene Profile",
+ REG_LIST_ACTIONS_PURGE_TIME_C = [=[Dies wird alle Profile löschen, die seit einem Monat nicht gesehen wurden.
+
+|cff00ff00%s]=], -- Needs review
+ REG_LIST_ACTIONS_PURGE_UNLINKED = "Profile ohne Charakter",
+ REG_LIST_ACTIONS_PURGE_UNLINKED_C = [=[Dies wird alle Profile, die nicht an einen WoW Charakter gebunden sind, löschen.
+
+|cff00ff00%s]=], -- Needs review
+ REG_LIST_CHAR_EMPTY = "Kein Charakter",
+ REG_LIST_CHAR_EMPTY2 = "Kein Charakter passt zu deiner Auswahl",
+ REG_LIST_CHAR_FILTER = "Charaktere: %s / %s",
+ REG_LIST_CHAR_IGNORED = "Ignoriert",
+ REG_LIST_CHAR_SEL = "Charakter wählen",
+ REG_LIST_CHAR_TITLE = "Charakterliste",
+ REG_LIST_CHAR_TT = "Zum Anzeigen klicken", -- Needs review
+ REG_LIST_CHAR_TT_CHAR = "Gebundene WoW Charakter/e:",
+ REG_LIST_CHAR_TT_CHAR_NO = "Nicht an einen Charakter gebunden",
+ REG_LIST_CHAR_TT_DATE = [=[Zuletzt gesehen: |cff00ff00%s|r
+Wo zuletzt gesehen: |cff00ff00%s|r]=],
+ REG_LIST_CHAR_TT_GLANCE = "Auf den ersten Blick",
+ REG_LIST_CHAR_TT_IGNORE = "Ignorierte Charakter/e",
+ REG_LIST_CHAR_TT_NEW_ABOUT = "Ungelesene Beschreibung",
+ REG_LIST_CHAR_TT_RELATION = [=[Beziehung:
+|cff00ff00%s]=],
+ REG_LIST_CHAR_TUTO_ACTIONS = "Diese Spalte erlabt es dir, mehrere Charaktere auszuwählen, um die selbe Aktion auf diese auszuführen.", -- Needs review
+ REG_LIST_CHAR_TUTO_FILTER = [=[Du kannst nach verschiedenen Kriterien filtern.
+
+Der |cff00ff00Namensfilter|r wird nach bestimmten Profilnamen suchen (Vorname + Nachname) sowie nach WoW Charakteren.
+
+Der |cff00ff00Gildenfilter|r wird nach Charakteren einer bestimmten Gilde suchen.
+
+Der |cff00ff00Realm Only Filter|r wird nur nach Charakteren auf dem aktuellen Realm suchen.]=], -- Needs review
+ REG_LIST_CHAR_TUTO_LIST = [=[Die erste Spalte zeigt den Charakternamen.
+
+Die zweite Spalte zeigt die Beziehung zwischen den Charakteren und deinem Charakter.
+
+Die letzte Spalte ist für diverse Angaben. (ignoriert ..etc.)]=],
+ REG_LIST_FILTERS = "Filter",
+ REG_LIST_FILTERS_TT = [=[|cffffff00Links-Klick:|r Filter anwenden
+|cffffff00Rechts-Klicken:|r Filter zurücksetzen]=],
+ REG_LIST_FLAGS = "Flags",
+ REG_LIST_GUILD = "Gilde des Charakters",
+ REG_LIST_IGNORE_EMPTY = "Keine ignorierter Charaktere", -- Needs review
+ REG_LIST_IGNORE_TITLE = "Liste ignorierter Charaktere", -- Needs review
+ REG_LIST_IGNORE_TT = [=[Grund:
+|cff00ff00%s
+
+|cffffff00Klicken, um von der Liste zu streichen]=], -- Needs review
+ REG_LIST_NAME = "Name das Charakters",
+ REG_LIST_NOTIF_ADD = "Neues Profil gefunden für |cff00ff00%s",
+ REG_LIST_NOTIF_ADD_CONFIG = "Neues Profil gefunden",
+ REG_LIST_NOTIF_ADD_NOT = "Dieses Profil existiert nicht mehr.",
+ REG_LIST_PET_MASTER = "Name des Herren",
+ REG_LIST_PET_NAME = "Name des Begleiters",
+ REG_LIST_PETS_EMPTY = "Kein/e Begleiter",
+ REG_LIST_PETS_EMPTY2 = "Kein Begleiter passt zu deiner Auswahl",
+ REG_LIST_PETS_FILTER = "Begleiter: %s / %s",
+ REG_LIST_PETS_TITLE = "Begleiterliste",
+ REG_LIST_PETS_TOOLTIP = "Wurde gesehen bei",
+ REG_LIST_PETS_TOOLTIP2 = "Wurde gesehen mit",
+ REG_LIST_PET_TYPE = "Typ des Begleiters",
+ REG_LIST_REALMONLY = "Nur dieser Realm",
+ REG_MSP_ALERT = [=[|cffff0000WARNUNG
+
+Du kannst nicht mehrere Addons nutzen, die das Mary Sue Protocol (MSP) nutzen, da das zu Fehlern führen kann!|r
+
+Aktuell geladen: |cff00ff00%s
+
+|cffff9900Deshalb wir der MSP Support für Total RP3 deaktiviert.|r
+
+Wenn du TRP3 nicht als dein MSP Addon nutzen und diese Meldung nicht noch einmal sehen willst, kannst du das Mary Sue Protocol Modul in den TRP3 Einstellungen unter Modul Status deaktivieren.]=], -- Needs review
+ REG_PLAYER = "Charakter",
+ REG_PLAYER_ABOUT = "Über",
+ REG_PLAYER_ABOUT_ADD_FRAME = "Fenster hinzufügen",
+ REG_PLAYER_ABOUT_EMPTY = "Keine Beschreibung",
+ REG_PLAYER_ABOUT_HEADER = "Titeltag", -- Needs review
+ REG_PLAYER_ABOUT_MUSIC = "Charaktersoundtrack", -- Needs review
+ REG_PLAYER_ABOUT_MUSIC_LISTEN = "Soundtrack abspielen",
+ REG_PLAYER_ABOUT_MUSIC_REMOVE = "Soundtrack abwählen",
+ REG_PLAYER_ABOUT_MUSIC_SELECT = "Charakter Soundtrack wählen",
+ REG_PLAYER_ABOUT_MUSIC_SELECT2 = "Soundtrack wählen",
+ REG_PLAYER_ABOUT_MUSIC_STOP = "Soundtrack stoppen",
+ REG_PLAYER_ABOUT_NOMUSIC = "|cffff9900Kein Soundtrack",
+ REG_PLAYER_ABOUT_P = "Paragraph tag",
+ REG_PLAYER_ABOUT_REMOVE_FRAME = "Diese Fenster entfernen",
+ REG_PLAYER_ABOUTS = "Über %s",
+ REG_PLAYER_ABOUT_SOME = "Irgendein Text ...",
+ REG_PLAYER_ABOUT_T1_YOURTEXT = "Dein Text hier",
+ REG_PLAYER_ABOUT_TAGS = "Formatierungstools",
+ REG_PLAYER_ABOUT_UNMUSIC = "|cffff9900Unbekannter Soundtrack",
+ REG_PLAYER_ABOUT_VOTE_DOWN = "Ich mag diesen Inhalt nicht.", -- Needs review
+ REG_PLAYER_ABOUT_VOTE_NO = [=[Kein Charakter der mit diesem Profil verbunden ist, scheint online zu sein.
+Möchtest du Total RP 3 trotzdem bewerten lassen?]=], -- Needs review
+ REG_PLAYER_ABOUT_VOTES = "Statistiken",
+ REG_PLAYER_ABOUT_VOTE_SENDING = "Sende deine Bewertung an %s ...", -- Needs review
+ REG_PLAYER_ABOUT_VOTE_SENDING_OK = "Deine Bewertung wurde an %s gesendet!", -- Needs review
+ REG_PLAYER_ABOUT_VOTES_R = [=[|cff00ff00%s Inhalt positiv bewerten
+|cffff0000%s Inhalt negativ bewerten]=], -- Needs review
+ REG_PLAYER_ABOUT_VOTE_TT = "Diese Bewertung ist komplett anonym und kann nur vom bewerteten Spieler gesehen werden.", -- Needs review
+ REG_PLAYER_ABOUT_VOTE_TT2 = "Du kannst nur bewerten, wenn der Charakter online ist .", -- Needs review
+ REG_PLAYER_ABOUT_VOTE_UP = "Ich mag den Inhalt",
+ REG_PLAYER_ADD_NEW = "Neu erstellen", -- Needs review
+ REG_PLAYER_AGE = "Alter",
+ REG_PLAYER_AGE_TT = [=[Hier kannst du angeben, wie alt dein Charakter ist.
+
+Hierfür gibt es mehrere Möglichkeiten:|c0000ff00
+- Du kannst Jahre angeben,
+- Oder ein Adjektiv (jung, ausgewachsen, erwachsen, steinalt, etc.).]=], -- Needs review
+ REG_PLAYER_ALERT_HEAVY_SMALL = [=[|cffff0000Dein Profil ist sehr lang.
+|cffff9900Du solltest versuchen, die Länge reduzieren.]=], -- Needs review
+ REG_PLAYER_BIRTHPLACE = "Geburtsort",
+ REG_PLAYER_BIRTHPLACE_TT = [=[Hier kannst du den Geburtsort deines Charakters angeben. Das kann entweder ein Ort, eine Zone oder ein Kontinent sein. Es liegt ganz an dir, wie akkurat du es angeben möchtest.
+
+|c00ffff00Du kannst den Button rechts verwenden, um ganz einfach den aktuellen Ort als deinen Geburtsort festzulegen.]=], -- Needs review
+ REG_PLAYER_BKG = "Hintergrundlayout",
+ REG_PLAYER_BKG_TT = "Dies repräsentiert den grafischen Hintergrund für dein Charakteristikfenster.", -- Needs review
+ REG_PLAYER_CARACT = "Charakteristiken",
+ REG_PLAYER_CHANGE_CONFIRM = [=[Du hast ungespeicherte Daten.
+Möchtest du die Seite dennoch wechseln?
+|cffff9900Alle änderungen gehen verloren.]=], -- Needs review
+ REG_PLAYER_CHARACTERISTICS = "Charakteristiken",
+ REG_PLAYER_CLASS = "Klasse",
+ REG_PLAYER_CLASS_TT = [=[Die Klasse deines Charakters.
+
+|cff00ff00Zum Beispiel :|r
+Ritter, Pyromane, Nekromant, Eliteschütze, Arkanwirker, Magd ...]=],
+ REG_PLAYER_COLOR_CLASS = "Klassenfarbe",
+ REG_PLAYER_COLOR_CLASS_TT = [=[Dies bestimmt ebenfalls die Farbe des Charakternamens.
+
+]=],
+ REG_PLAYER_COLOR_TT = [=[|cffffff00Linksklick:|r Wähle eine Farbe
+|cffffff00Rechtsklick:|r Farbe abwählen]=], -- Needs review
+ REG_PLAYER_CURRENT = "Aktuelles",
+ REG_PLAYER_CURRENTOOC = "Aktuelles (OOC)",
+ REG_PLAYER_CURRENT_OOC = "Dies ist eine OOC Information.", -- Needs review
+ REG_PLAYER_EYE = "Augenfarbe",
+ REG_PLAYER_EYE_TT = [=[Hier kannst du die Augenfarbe eintragen.
+
+Bedenke bitte das, auch wenn dein Charakter ein komplett verhülltes Gesicht hat, es trotzdem sinvoll sein kann die Augenfarbe hier zu erwähnen.]=],
+ REG_PLAYER_FIRSTNAME = "Vorname",
+ REG_PLAYER_FIRSTNAME_TT = [=[Das ist der Vorname deines Charakters. Dies ist ein Freies Feld, wenn du nichts einträgst wird der Spielname (|cffffff00%s|r) deines Charakters benutzt.
+
+Du kannst einen |c0000ff00Spitznamen|r verwenden!]=],
+ REG_PLAYER_FULLTITLE = "Voller Titel",
+ REG_PLAYER_FULLTITLE_TT = [=[Hier kannst du den Vollen Titel deines Charakter eintragen. Dies kann der komplette volle Titel deines Charakters oder weiter Titel sein.
+
+Wie dem auch sei, versuche bitte Wiederholungen zu vermeinden falls es keine weiteren Informationen zu deinem Titel mehr gibt.]=],
+ REG_PLAYER_GLANCE = "Auf den ersten Blick",
+ REG_PLAYER_GLANCE_BAR_DELETED = "Gruppenvoreinstellung |cffff9900%s|r wurde gelöscht.", -- Needs review
+ REG_PLAYER_GLANCE_BAR_EMPTY = "Der Name einer Voreinstellung darf nicht leer sein.", -- Needs review
+ REG_PLAYER_GLANCE_BAR_LOAD = "Gruppenvoreinstellung", -- Needs review
+ REG_PLAYER_GLANCE_BAR_LOAD_SAVE = "Gruppenvoreinstellungen", -- Needs review
+ REG_PLAYER_GLANCE_BAR_NAME = [=[Bitte gibt einen Voreinstellungsnamen ein
+
+|cff00ff00Hinweis: Wenn der Name bereits von einer anderen Voreinstellung genutzt wird, wird diese ersetzt.]=], -- Needs review
+ REG_PLAYER_GLANCE_BAR_SAVE = "Speichere diese Gruppe als Voreinstellung.", -- Needs review
+ REG_PLAYER_GLANCE_BAR_SAVED = "Gruppenvoreinstellung |cff00ff00%s|r wurde erstellt.", -- Needs review
+ REG_PLAYER_GLANCE_BAR_TARGET = "\"Auf den ersten Blick\" Voreinstellungen", -- Needs review
+ REG_PLAYER_GLANCE_CONFIG = [=[
+|cffffff00Links-Klick:|r Slot konfigurieren
+|cffffff00Rechts-Klick:|r Slot aktivierung umschalten
+|cffffff00Drag & drop:|r Slots neu anordnen]=],
+ REG_PLAYER_GLANCE_EDITOR = "Slot Editor",
+ REG_PLAYER_GLANCE_PRESET = "Voreinstellung laden",
+ REG_PLAYER_GLANCE_PRESET_ALERT1 = "Bitte eine Kategorie und einen Namen angeben",
+ REG_PLAYER_GLANCE_PRESET_ALERT2 = "Es gibt schon eine Voreinstellung Namens %s",
+ REG_PLAYER_GLANCE_PRESET_CATEGORY = "Voreinstellungskategorie",
+ REG_PLAYER_GLANCE_PRESET_NAME = "Voreinstellungsname",
+ REG_PLAYER_GLANCE_PRESET_NONE = "Slot leeren", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_SAVE = "Informationen als Vorseinstellung speichern",
+ REG_PLAYER_GLANCE_PRESET_SAVE_SMALL = "Als Voreinstellung speichern",
+ REG_PLAYER_GLANCE_PRESET_SELECT = "Voreinstellung auswählen",
+ REG_PLAYER_GLANCE_TITLE = "Attributsname",
+ REG_PLAYER_GLANCE_UNUSED = "Unbenutzer Slot",
+ REG_PLAYER_GLANCE_USE = "Diesen Slot aktivieren",
+ REG_PLAYER_HEIGHT = "Größe",
+ REG_PLAYER_HEIGHT_TT = [=[Die Größe deines Charakters.
+Hierfür gibt es mehrere Möglichkeiten:|c0000ff00
+- Eine komplette Zahl: 170 cm, 1,45 m ...
+- Eine Beschreibung: großgewachsen, klein ...]=], -- Needs review
+ REG_PLAYER_HERE = "Position abfragen",
+ REG_PLAYER_HERE_TT = "Klicke hier, um deine aktuelle Position abzufragen", -- Needs review
+ REG_PLAYER_HISTORY = "Hintergrund",
+ REG_PLAYER_ICON = "Charaktericon", -- Needs review
+ REG_PLAYER_ICON_TT = "Wähle eine Grafik, die deinen Charakter symbolisiert.", -- Needs review
+ REG_PLAYER_IGNORE = "Ignoriere verlinkte Charaktere (%s)",
+ REG_PLAYER_IGNORE_WARNING = [=[Möchtest du diese Charaktere ignorieren?
+
+|cffff9900%s
+
+|rOptional kannst du einen Grund angeben. Dies ist eine persönliche Notiz und kann nur von dir eingesehen werden.]=],
+ REG_PLAYER_LASTNAME = "Nachname",
+ REG_PLAYER_LASTNAME_TT = "Dies ist der Familienname deines Charakters.",
+ REG_PLAYER_LEFTTRAIT = "Linkes Attribut",
+ REG_PLAYER_MISC_ADD = "Füge ein weiteres Feld hinzu", -- Needs review
+ REG_PLAYER_MORE_INFO = "Zusätzliche Informationen",
+ REG_PLAYER_MSP_HOUSE = "Hausname",
+ REG_PLAYER_MSP_MOTTO = "Motto",
+ REG_PLAYER_MSP_NICK = "Spitzname",
+ REG_PLAYER_NAMESTITLES = "Namen und Titel",
+ REG_PLAYER_NO_CHAR = "Keine Charakterstik",
+ REG_PLAYER_PEEK = "Verschiedenes",
+ REG_PLAYER_PHYSICAL = "Aussehen",
+ REG_PLAYER_PSYCHO = "Persönliche Merkmale", -- Needs review
+ REG_PLAYER_PSYCHO_Acete = "Asketisch",
+ REG_PLAYER_PSYCHO_ADD = "Personliches Merkmal hinzufügen", -- Needs review
+ REG_PLAYER_PSYCHO_ATTIBUTENAME_TT = "Attributsname",
+ REG_PLAYER_PSYCHO_Bonvivant = "Lebemann",
+ REG_PLAYER_PSYCHO_CHAOTIC = "Chaotisch",
+ REG_PLAYER_PSYCHO_Chaste = "Keusch",
+ REG_PLAYER_PSYCHO_Conciliant = "Vorbildlich",
+ REG_PLAYER_PSYCHO_Couard = "Rückgratlos",
+ REG_PLAYER_PSYCHO_CREATENEW = "Erstelle einen Wert",
+ REG_PLAYER_PSYCHO_Cruel = "Brutal",
+ REG_PLAYER_PSYCHO_CUSTOM = "Benutzerdefinierter Wert",
+ REG_PLAYER_PSYCHO_Egoiste = "Egoistisch",
+ REG_PLAYER_PSYCHO_Genereux = "Altruistisch",
+ REG_PLAYER_PSYCHO_Impulsif = "Impulsiv",
+ REG_PLAYER_PSYCHO_Indulgent = "Vergebend",
+ REG_PLAYER_PSYCHO_LEFTICON_TT = "Linkes Attributsicon auswählen.",
+ REG_PLAYER_PSYCHO_Loyal = "Rechtschaffen",
+ REG_PLAYER_PSYCHO_Luxurieux = "Lüstern",
+ REG_PLAYER_PSYCHO_Misericordieux = "Sanft", -- Needs review
+ REG_PLAYER_PSYCHO_MORE = "Punkt zu \"%s\" hinzufügen",
+ REG_PLAYER_PSYCHO_PERSONAL = "Persönliche Werte",
+ REG_PLAYER_PSYCHO_Pieux = "Abergläubisch",
+ REG_PLAYER_PSYCHO_POINT = "Punkt hinzufügen",
+ REG_PLAYER_PSYCHO_Pragmatique = "Abtrünnig",
+ REG_PLAYER_PSYCHO_Rationnel = "Rational",
+ REG_PLAYER_PSYCHO_Reflechi = "Vorsichtig",
+ REG_PLAYER_PSYCHO_Rencunier = "Rachsüchtig",
+ REG_PLAYER_PSYCHO_RIGHTICON_TT = "Rechtes Attributsicon auswählen.",
+ REG_PLAYER_PSYCHO_Sincere = "Ehrlich",
+ REG_PLAYER_PSYCHO_SOCIAL = "Soziale Werte",
+ REG_PLAYER_PSYCHO_Trompeur = "Unehrlich",
+ REG_PLAYER_PSYCHO_Valeureux = "Tapfer",
+ REG_PLAYER_RACE = "Rasse",
+ REG_PLAYER_RACE_TT = "Hier gehört die Rasse des Charakters rein. Die Rasse muss nicht der Spielrasse entsprechen. Es gibt im Warcraft-Universum genügend Kreaturen, die sich ähnlich sehen.", -- Needs review
+ REG_PLAYER_REGISTER = "Registerinformationen", -- Needs review
+ REG_PLAYER_RESIDENCE = "Heimat",
+ REG_PLAYER_RESIDENCE_TT = [=[Hier kannst du angeben, wo dein Charakter normalerweise lebt. Das kann eine genaue Adresse sein (dein Heim) oder einfach der Ort oder die Region, in der dein Charakter lebt.
+Wenn dein Charakter obdachlos ist oder durch die Welt streift, dann denke daran, die Informationen anzupassen.
+
+|c00ffff00Du kannst den rechten Button verwenden, um ganz einfach den aktuellen Ort als deinen Geburtsort festzulegen.]=], -- Needs review
+ REG_PLAYER_RIGHTTRAIT = "Rechtes Attribut",
+ REG_PLAYER_SHOWMISC = "Zeige Sonstiges Frame",
+ REG_PLAYER_SHOWMISC_TT = [=[Anwählen, wenn du benutzerdefinierte Felder auf deinem Charakter anzeigen möchtest.
+
+Wenn du die benutzerdefinierten Felder nicht angezeigt haben willst lasse das Häkchen weg und das Sonstiges Frame wird komplett deaktiviert.]=], -- Needs review
+ REG_PLAYER_SHOWPSYCHO = "Zeige Persönlichkeitsfenster", -- Needs review
+ REG_PLAYER_SHOWPSYCHO_TT = [=[Anwählen, wenn du die Persönlichkeitsbeschreibung nutzen möchtest.
+
+Wenn du die Persönlichkeit deines Charakter auf diese Art nicht angeben möchtest, dann wähle die Option nicht aus und das Persönlichkeitsfenster wird nicht angezeigt werden.]=], -- Needs review
+ REG_PLAYER_STYLE_ASSIST = "Rollenspielassistenz", -- Needs review
+ REG_PLAYER_STYLE_BATTLE = "RP-Kampfstil",
+ REG_PLAYER_STYLE_BATTLE_1 = "World of Warcraft PVP",
+ REG_PLAYER_STYLE_BATTLE_2 = "TRP Würfelkampf (noch nicht verfügbar)", -- Needs review
+ REG_PLAYER_STYLE_BATTLE_3 = "/würfeln Kampf",
+ REG_PLAYER_STYLE_BATTLE_4 = "Emotekampf", -- Needs review
+ REG_PLAYER_STYLE_DEATH = "Akzeptiere Charaktertod", -- Needs review
+ REG_PLAYER_STYLE_EMPTY = "Kein Rollenspielattribut geteilt",
+ REG_PLAYER_STYLE_FREQ = "In-Character Häufigkeit", -- Needs review
+ REG_PLAYER_STYLE_FREQ_1 = "Vollzeit, kein OOC",
+ REG_PLAYER_STYLE_FREQ_2 = "Die meiste Zeit",
+ REG_PLAYER_STYLE_FREQ_3 = "Gelegentlich",
+ REG_PLAYER_STYLE_FREQ_4 = "Gewöhnlich",
+ REG_PLAYER_STYLE_FREQ_5 = "Vollzeit OOC, kein RP Charakter",
+ REG_PLAYER_STYLE_GUILD = "Gildenmitgliedschaft",
+ REG_PLAYER_STYLE_GUILD_IC = "IC Mitglied",
+ REG_PLAYER_STYLE_GUILD_OOC = "OOC Mitglied",
+ REG_PLAYER_STYLE_HIDE = "Nicht anzeigen",
+ REG_PLAYER_STYLE_INJURY = "Akzeptiere Charakterverletzungen", -- Needs review
+ REG_PLAYER_STYLE_PERMI = "Mit Spielererlaubnis", -- Needs review
+ REG_PLAYER_STYLE_ROMANCE = "Akzeptiere Charakterromanze", -- Needs review
+ REG_PLAYER_STYLE_RPSTYLE = "Rollenspielstil", -- Needs review
+ REG_PLAYER_STYLE_RPSTYLE_SHORT = "RP Stil",
+ REG_PLAYER_STYLE_WOWXP = "World of Warcraft Erfahrung",
+ REG_PLAYER_TITLE = "Titel",
+ REG_PLAYER_TITLE_TT = [=[Der Titel deines Charakters ist der Titel, mit dem er angesprochen wird. Vermeide bitte lange Titel, für diesen Zweck kannst du das Feld "Kompletter Titel" verwenden.
+
+Beispiele |c0000ff00passender Titel |r:
+|c0000ff00- Graf,
+- Vogt,
+- Magier,
+- Lord,
+- etc.
+|rBeispiele |cffff0000unpassender Titel|r:
+|cffff0000- Graf der Nordmarschen,
+- Erzmagier des Zirkels von Sturmwind,
+- Diplomat der Draenei,
+- etc.]=], -- Needs review
+ REG_PLAYER_TRP2_PIERCING = "Piercings", -- Needs review
+ REG_PLAYER_TRP2_TATTOO = "Tattoos", -- Needs review
+ REG_PLAYER_TRP2_TRAITS = "Gesichtzüge", -- Needs review
+ REG_PLAYER_TUTO_ABOUT_COMMON = [=[|cff00ff00Charaktersoundtrack:|r
+Du kannst einen |cffffff00Soundtrack|r für deinen Charakter aussuchen. Stell es dir als |cffffff00Hintergundmusik beim Lesen deiner Charakterbeschreibung vor|r.
+
+|cff00ff00Hintergund:|r
+Dies ist eine |cffffff00Hintergrundtextur|r für deine Charakterbeschreibung.
+
+|cff00ff00Template:|r
+Das gewählte Template gibt Auskunft über |cffffff00das generelle Aussehen und die Schriftmöglichkeiten|r deiner Beschreibung.
+|cffff9900Nur das ausgewählte Template ist für andere sichtbar. Du musst also nicht alle ausfüllen.|r
+Sobald ein Template ausgewählt ist, kannst du das Tutorial nochmals öffnen, um dir Hilfe zu jedem Template anzeigen zu lassen.]=], -- Needs review
+ REG_PLAYER_TUTO_ABOUT_MISC_1 = [=[Dieser Teil stellt dir|cffffff005 Slots|r zur Verfügung, in denen du die |cff00ff00wichtigsten Informationen zu deinem Charakter|r beschreiben kannst.
+
+Die Slots sind in |cffffff00"Auf den ersten Blick"|r ersichtlich wenn jemand deinen Charakter anwählt.
+
+|cff00ff00Hinweis: Du kannst die Slots per Drag&Drop neu anordnen.|r
+Das funktioniert auch in der Sektion |cffffff00"Auf den ersten Blick"|r!]=], -- Needs review
+ REG_PLAYER_TUTO_ABOUT_MISC_3 = "Dieser Teil enthält |cffffff00eine Liste von Informationen|r, die eine Menge |cffffff00einfache Fragen zu der Art, wie du deinen Charakter spielst, beantwortet|r.", -- Needs review
+ REG_PLAYER_TUTO_ABOUT_T1 = [=[Dieses Template erlaubt dir deine |cff00ff00Beschreibung frei zu gestalten|r.
+
+Die Beschreibung muss nicht auf die |cffff9900physische Beschreibung|r deines Charakters beschränkt sein. Gibt ruhig Teile seines |cffff9900Hintergrundes|r oder Details zu seiner |cffff9900Persönlichkeit|r an.
+
+Mit diesem Template hast du Zugriff auf die Formatierungstools, um beispielsweise |cffffff00Schriftgröße, Farben und Ausrichtung|r zu beeinflussen.
+Diese Tools erlauben auch das Einfügen von |cffffff00Bildern, Icons oder Links zu externen Internetseiten|r.]=], -- Needs review
+ REG_PLAYER_TUTO_ABOUT_T2 = [=[Dieses Template ist ein wenig strukturierter und besteht aus |cff00ff00einer Reihe unabhängiger Fenster|r.
+
+Jedes Fenster wird von einem eigenen |cffffff00Icon, einem Hintergrund und eineem Text|r repräsentiert. Beachte das du hier Texttags in diesen Fenstern nutzen kannst, genauso kannst du auch Farb- oder Icon-Tags verwenden.
+
+Die Beschreibung muss nicht auf die |cffff9900physische Beschreibung|r deines Charakters beschränkt sein. Gibt ruhig Teile seines |cffff9900Hintergrundes|r oder Details zu seiner |cffff9900Persönlichkeit|r an.]=], -- Needs review
+ REG_PLAYER_TUTO_ABOUT_T3 = [=[Dieses Template ist in 3 Teile unterteilt: |cff00ff00Die Physische Beschreibung, Persönlichkeit und Hintergrundgeschichte|r.
+
+Du musst nicht alle Fenster ausfüllen, |cffff9900wenn du eines frei läßt wird es in deiner Beschreibung einfach nicht angezeigt|r.
+
+Jedes Fenster wird von einem eigenen |cffffff00Icon, einem Hintergrund und einem Text|r repräsentiert. Beachte das du hier Texttags in diesen Fenstern nutzen kannst, genauso kannst du auch Farb- oder Icon-Tags verwenden.]=], -- Needs review
+ REG_PLAYER_WEIGHT = "Körperform",
+ REG_PLAYER_WEIGHT_TT = [=[Dies ist die Körperform deines Charakters.
+Zum Beispiel kann du folgendes angeben |c0000ff00schlank, dick or muskulös...|r oder einfach durchschnittlich!]=], -- Needs review
+ REG_REGISTER = "Register",
+ REG_REGISTER_CHAR_LIST = "Charakterliste",
+ REG_RELATION = "Beziehung", -- Needs review
+ REG_RELATION_BUSINESS = "Geschäftlich",
+ REG_RELATION_BUSINESS_TT = "%s und %s haben eine Geschäftsbeziehung.", -- Needs review
+ REG_RELATION_BUTTON_TT = [=[Beziehung: %s
+|cff00ff00%s
+
+|cffffff00Klicke, um mögliche Aktionen zu wählen]=], -- Needs review
+ REG_RELATION_FAMILY = "Familie",
+ REG_RELATION_FAMILY_TT = "%s hat Blutsbande mit %s.",
+ REG_RELATION_FRIEND = "Freundlich",
+ REG_RELATION_FRIEND_TT = "%s nennt %s einen Freund.",
+ REG_RELATION_LOVE = "Liebe",
+ REG_RELATION_LOVE_TT = "%s ist in %s verliebt!",
+ REG_RELATION_NEUTRAL = "Neutral",
+ REG_RELATION_NEUTRAL_TT = "%s hat keine spezielle Beziehung zu %s.",
+ REG_RELATION_NONE = "Keine",
+ REG_RELATION_NONE_TT = "%s kennt %s nicht.",
+ REG_RELATION_TARGET = "|cffffff00Klick: |rBeziehung ändern",
+ REG_RELATION_UNFRIENDLY = "Unfreundlich",
+ REG_RELATION_UNFRIENDLY_TT = "%s mag %s offensichtlich nicht.",
+ REG_TT_GUILD = "%s von |cffff9900%s",
+ REG_TT_GUILD_IC = "IC Mitglied",
+ REG_TT_GUILD_OOC = "OOC Mitglied",
+ REG_TT_IGNORED = "< Charakter ist ignoriert >",
+ REG_TT_IGNORED_OWNER = "< Besitzer ist ignoriert >",
+ REG_TT_LEVEL = "Level %s %s",
+ REG_TT_NOTIF = "Ungelesene Beschreibung",
+ REG_TT_REALM = "Realm: |cffff9900%s",
+ REG_TT_TARGET = "Ziel: |cffff9900%s",
+ TB_AFK_MODE = "AFK",
+ TB_DND_MODE = "Nicht stören (DnD)",
+ TB_GO_TO_MODE = "Zu %s Modus wechseln",
+ TB_NORMAL_MODE = "Normal",
+ TB_RPSTATUS_OFF = "Charakter: |cffff0000Out of Character (OOC)", -- Needs review
+ TB_RPSTATUS_ON = "Charakter: |cff00ff00In Character (IC)", -- Needs review
+ TB_RPSTATUS_TO_OFF = "Zu |cffff0000Out of Character|r wechseln", -- Needs review
+ TB_RPSTATUS_TO_ON = "Zu |cff00ff00In Character|r wechseln", -- Needs review
+ TB_STATUS = "Spieler",
+ TB_SWITCH_CAPE_1 = "Zeige Umhang",
+ TB_SWITCH_CAPE_2 = "Verstecke Umhang",
+ TB_SWITCH_CAPE_OFF = "Umhang: |cffff0000Versteckt", -- Needs review
+ TB_SWITCH_CAPE_ON = "Umhang: |cff00ff00Angezeigt", -- Needs review
+ TB_SWITCH_HELM_1 = "Zeige Helm",
+ TB_SWITCH_HELM_2 = "Verstecke Helm",
+ TB_SWITCH_HELM_OFF = "Helm: |cffff0000Versteckt", -- Needs review
+ TB_SWITCH_HELM_ON = "Helm: |cff00ff00Angezeigt", -- Needs review
+ TB_SWITCH_PROFILE = "Zu einem anderen Profil wechseln",
+ TB_SWITCH_TOOLBAR = "Toolbar umschalten",
+ TB_TOOLBAR = "Toolbar",
+ TF_IGNORE = "Spieler ignorieren",
+ TF_IGNORE_CONFIRM = [=[Bist du sicher das du die ID ignorieren willst?
+
+|cffffff00%s|r
+
+|cffff7700Du kannst optional angeben, warum die diesen Spieler ignorierst. Dies ist eine persönliche Notiz und kann nicht von anderen Spielern eingesehen werden.]=], -- Needs review
+ TF_IGNORE_NO_REASON = "Kein Grund",
+ TF_IGNORE_TT = "|cffffff00Klicken:|r Spieler ignorieren",
+ TF_OPEN_CHARACTER = "Charakterseite anzeigen",
+ TF_OPEN_COMPANION = "Begleiterseite anzeigen",
+ TF_PLAY_THEME = "Charaktersoundtrack abspielen",
+ TF_PLAY_THEME_TT = [=[|cffffff00Linksklick:|r Abspielen |cff00ff00%s
+|cffffff00Rechtsklick:|r Stop]=], -- Needs review
+ UI_BKG = "Hintergrund %s", -- Needs review
+ UI_CLOSE_ALL = "Alle schließen",
+ UI_COLOR_BROWSER = "Farbwähler", -- Needs review
+ UI_COLOR_BROWSER_SELECT = "Farbe auswählen",
+ UI_FILTER = "Filter",
+ UI_ICON_BROWSER = "Iconbrowser", -- Needs review
+ UI_ICON_BROWSER_HELP = "Icon kopieren", -- Needs review
+ UI_ICON_BROWSER_HELP_TT = [=[Während dieses Fenter geöffnet ist, kannst du mit |cffffff00ctrl + Klick|r auf ein Icon anwenden, um dessen Namen zu kopieren.
+
+Das funktioniert:|cff00ff00
+- Mit jedem Item in deinem Inventar
+- Mit jeder Fähigkeit in deinem Zauberbuch|r]=], -- Needs review
+ UI_ICON_SELECT = "Icon auswählen",
+ UI_IMAGE_BROWSER = "Bildbrowser", -- Needs review
+ UI_IMAGE_SELECT = "Bild auswählen",
+ UI_LINK_TEXT = "Dein Text",
+ UI_LINK_URL = "http://deine.url.hier.de",
+ UI_LINK_WARNING = [=[Hier ist die Link URL.
+Du kannst sie per Copy/Paste in deinen Browser kopieren.
+
+|cffff0000!! Disclaimer !!|r
+Total RP ist NICHT für Links verantwortlich, die auf schädlichen oder illegalen Inhalt verweisen!]=], -- Needs review
+ UI_MUSIC_BROWSER = "Musikbrowser", -- Needs review
+ UI_MUSIC_SELECT = "Musik auswählen",
+ UI_TUTO_BUTTON = "Tutorialmodus", -- Needs review
+ UI_TUTO_BUTTON_TT = "Klicke, um den Tutorialmodus ein/aus zu schalten", -- Needs review
+ }
+};
+
+TRP3_API.locale.registerLocale(LOCALE_DE);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale_enUS.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale_enUS.lua
new file mode 100644
index 000000000..3bab0862e
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale_enUS.lua
@@ -0,0 +1,814 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- English locale (default locale)
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local LOCALE_EN = {
+ locale = "enUS",
+ localeText = "English",
+ localeContent = {
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- GENERAL
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ GEN_WELCOME_MESSAGE = "Thank you for using Total RP 3 (v %s) ! Have fun !",
+ GEN_VERSION = "Version: %s (Build %s)",
+ GEN_NEW_VERSION_AVAILABLE = "A new version for Total RP 3 is available.\n\n|cffff0000Your version: %s\n|c0000ff00New version: %s|r\n\n|cffff9900We strongly encourage you to stay up-to-date.|r\n\nThis message will only appear once per session and can be disabled in the settings.",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- REGISTER
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ REG_PLAYER = "Character",
+ REG_PLAYER_CHANGE_CONFIRM = "You may have unsaved data changes.\nDo you want to change page anyway ?\n|cffff9900Any changes will be lost.",
+ REG_PLAYER_CARACT = "Characteristics",
+ REG_PLAYER_NAMESTITLES = "Names and titles",
+ REG_PLAYER_CHARACTERISTICS = "Characteristics",
+ REG_PLAYER_REGISTER = "Directory information",
+ REG_PLAYER_ICON = "Character's icon",
+ REG_PLAYER_ICON_TT = "Select a graphic representation for your character.",
+ REG_PLAYER_TITLE = "Title",
+ REG_PLAYER_TITLE_TT = "Your character's title is the title by which your character is usually called. Avoid long titles, as for those should you use the Full title attribute bellow.\n\n"
+ .."Example of |c0000ff00appropriate titles |r:\n|c0000ff00- Countess,\n- Marquis,\n- Magus,\n- Lord,\n- etc.\n|r"
+ .."Example of |cffff0000inappropriate titles|r:\n|cffff0000- Countess of the North Marshes,\n- Magus of the Stormwind Tower,\n- Diplomat for the Draenei Government,\n- etc.",
+ REG_PLAYER_FIRSTNAME = "First name",
+ REG_PLAYER_FIRSTNAME_TT = "This is your character's first name. This is a mandatory field, so if you don't specify a name, the default character's name (|cffffff00%s|r) will be used."
+ .."\n\nYou can use a |c0000ff00nickname |r!",
+ REG_PLAYER_LASTNAME = "Last name",
+ REG_PLAYER_LASTNAME_TT = "This is your character's family name.",
+ REG_PLAYER_HERE = "Get position",
+ REG_PLAYER_HERE_TT = "Click to get your current position",
+ REG_PLAYER_COLOR_CLASS = "Class color",
+ REG_PLAYER_COLOR_CLASS_TT = "This will also determines the name color.\n\n",
+ REG_PLAYER_COLOR_TT = "|cffffff00Click:|r Select a color\n|cffffff00Right-click:|r Discard color",
+ REG_PLAYER_FULLTITLE = "Full title",
+ REG_PLAYER_FULLTITLE_TT = "Here you can write down your character's full title. It can either be a longer version of the Title or another title entirely.\n\nHowever, you may want to avoid repetitions, in case there's no additional info to mention.",
+ REG_PLAYER_RACE = "Race",
+ REG_PLAYER_RACE_TT = "Here goes your character's race. It doesn't have to be restricted to playable races. There are many Warcraft races that can assume common shapes ...",
+ REG_PLAYER_BKG = "Background layout",
+ REG_PLAYER_BKG_TT = "This represents the graphical background to use for your Characteristics layout.",
+ REG_PLAYER_CLASS = "Class",
+ REG_PLAYER_CLASS_TT = "This is your character's custom class.\n\n|cff00ff00For instance :|r\nKnight, Pyrotechnist, Necromancer, Elite shooter, Arcanist ...",
+ REG_PLAYER_AGE = "Age",
+ REG_PLAYER_AGE_TT = "Here you can indicate how old your character is.\n\nThere are several way to do this:|c0000ff00\n- Either use years,\n- Or an adjective (Young, Mature, Adult, Venerable, etc.).",
+ REG_PLAYER_EYE = "Eye color",
+ REG_PLAYER_EYE_TT = "Here your can indicate the color of your character's eyes.\n\nKeep in mind that, even if your character's face is constantly hidden, that might still be worth mentioning, just in case.",
+ REG_PLAYER_HEIGHT = "Height",
+ REG_PLAYER_HEIGHT_TT = "This is your character's height.\nThere are several way to do this:|c0000ff00\n- A precise number: 170 cm, 6'5\" ...\n- A qualificative: Tall, short ...",
+ REG_PLAYER_WEIGHT = "Body shape",
+ REG_PLAYER_WEIGHT_TT = "This is your character's body shape.\nFor instance they could be |c0000ff00slim, fat or muscular...|r Or they could simply be regular !",
+ REG_PLAYER_BIRTHPLACE = "Birthplace",
+ REG_PLAYER_BIRTHPLACE_TT = "Here you can indicate the birthplace of your character. This can either be a region, a zone, or even a continent. It's for you to decide how accurate you want to be.\n\n"
+ .."|c00ffff00You can use the button to the right to easily set your current location as Birthplace.",
+ REG_PLAYER_RESIDENCE = "Residence",
+ REG_PLAYER_RESIDENCE_TT = "Here you can indicate where you character normally lives. This could be their personal address (their home) or a place they can crash."
+ .."\nNote that if your character is a wanderer or even homeless, you will need to change the information accordingly.\n\n|c00ffff00You can use the button to the right to easily set your current location as Residence.",
+ REG_PLAYER_MSP_MOTTO = "Motto",
+ REG_PLAYER_MSP_HOUSE = "House name",
+ REG_PLAYER_MSP_NICK = "Nickname",
+ REG_PLAYER_TRP2_TRAITS = "Physiognomy",
+ REG_PLAYER_TRP2_PIERCING = "Piercings",
+ REG_PLAYER_TRP2_TATTOO = "Tattoos",
+ REG_PLAYER_PSYCHO = "Personality traits",
+ REG_PLAYER_ADD_NEW = "Create new",
+ REG_PLAYER_HISTORY = "History",
+ REG_PLAYER_MORE_INFO = "Additional information",
+ REG_PLAYER_PHYSICAL = "Physical Description",
+ REG_PLAYER_NO_CHAR = "No characteristics",
+ REG_PLAYER_SHOWPSYCHO = "Show personality frame",
+ REG_PLAYER_SHOWPSYCHO_TT = "Check if you want to use the personality description.\n\nIf you don't want to indicate your character's personality this way, keep this box unchecked and the personality frame will remain totally hidden.",
+ REG_PLAYER_PSYCHO_ADD = "Add a personality trait",
+ REG_PLAYER_PSYCHO_POINT = "Add a point",
+ REG_PLAYER_PSYCHO_MORE = "Add a point to \"%s\"",
+ REG_PLAYER_PSYCHO_ATTIBUTENAME_TT = "Attribute name",
+ REG_PLAYER_PSYCHO_RIGHTICON_TT = "Set the right attribute icon.",
+ REG_PLAYER_PSYCHO_LEFTICON_TT = "Set the left attribute icon.",
+ REG_PLAYER_PSYCHO_SOCIAL = "Social traits",
+ REG_PLAYER_PSYCHO_PERSONAL = "Personal traits",
+ REG_PLAYER_PSYCHO_CHAOTIC = "Chaotic";
+ REG_PLAYER_PSYCHO_Loyal = "Lawful";
+ REG_PLAYER_PSYCHO_Chaste = "Chaste";
+ REG_PLAYER_PSYCHO_Luxurieux = "Lustful";
+ REG_PLAYER_PSYCHO_Indulgent = "Forgiving";
+ REG_PLAYER_PSYCHO_Rencunier = "Vindictive";
+ REG_PLAYER_PSYCHO_Genereux = "Altruistic";
+ REG_PLAYER_PSYCHO_Egoiste = "Selfish";
+ REG_PLAYER_PSYCHO_Sincere = "Truthful";
+ REG_PLAYER_PSYCHO_Trompeur = "Deceitful";
+ REG_PLAYER_PSYCHO_Misericordieux = "Gentle ";
+ REG_PLAYER_PSYCHO_Cruel = "Brutal";
+ REG_PLAYER_PSYCHO_Pieux = "Superstitious";
+ REG_PLAYER_PSYCHO_Pragmatique = "Renegade";
+ REG_PLAYER_PSYCHO_Conciliant = "Paragon";
+ REG_PLAYER_PSYCHO_Rationnel = "Rational";
+ REG_PLAYER_PSYCHO_Reflechi = "Cautious";
+ REG_PLAYER_PSYCHO_Impulsif = "Impulsive";
+ REG_PLAYER_PSYCHO_Acete = "Ascetic";
+ REG_PLAYER_PSYCHO_Bonvivant = "Bon vivant";
+ REG_PLAYER_PSYCHO_Valeureux = "Valorous";
+ REG_PLAYER_PSYCHO_Couard = "Spineless";
+ REG_PLAYER_PSYCHO_CUSTOM = "Custom trait",
+ REG_PLAYER_PSYCHO_CREATENEW = "Create a trait",
+ REG_PLAYER_LEFTTRAIT = "Left attribute",
+ REG_PLAYER_RIGHTTRAIT = "Right attribute",
+ REG_DELETE_WARNING = "Are you sure you want to delete %s's profile?\n",
+ REG_IGNORE_TOAST = "Character ignored",
+ REG_PLAYER_IGNORE = "Ignore linked characters (%s)",
+ REG_PLAYER_IGNORE_WARNING = "Do you want to ignore those characters ?\n\n|cffff9900%s\n\n|rYou can optionally enter the reason below. This is a personal note that will serve as reminder.",
+ REG_PLAYER_SHOWMISC = "Show miscellaneous frame",
+ REG_PLAYER_SHOWMISC_TT = "Check if you want to show custom fields for your character.\n\nIf you don't want to show custom fields, keep this box unchecked and the miscellaneous frame will remain totally hidden.",
+ REG_PLAYER_MISC_ADD = "Add an additional field",
+ REG_PLAYER_ABOUT = "About",
+ REG_PLAYER_ABOUTS = "About %s",
+ REG_PLAYER_ABOUT_MUSIC = "Character theme",
+ REG_PLAYER_ABOUT_NOMUSIC = "|cffff9900No theme",
+ REG_PLAYER_ABOUT_UNMUSIC = "|cffff9900Unknown theme",
+ REG_PLAYER_ABOUT_MUSIC_SELECT = "Select character theme",
+ REG_PLAYER_ABOUT_MUSIC_REMOVE = "Unselect theme",
+ REG_PLAYER_ABOUT_MUSIC_LISTEN = "Play theme",
+ REG_PLAYER_ABOUT_MUSIC_STOP = "Stop theme",
+ REG_PLAYER_ABOUT_MUSIC_SELECT2 = "Select theme",
+ REG_PLAYER_ABOUT_T1_YOURTEXT = "Your text here",
+ REG_PLAYER_ABOUT_HEADER = "Title tag",
+ REG_PLAYER_ABOUT_ADD_FRAME = "Add a frame",
+ REG_PLAYER_ABOUT_REMOVE_FRAME = "Remove this frame",
+ REG_PLAYER_ABOUT_P = "Paragraph tag",
+ REG_PLAYER_ABOUT_TAGS = "Formatting tools",
+ REG_PLAYER_ABOUT_SOME = "Some text ...",
+ REG_PLAYER_ABOUT_VOTE_UP = "I like this content",
+ REG_PLAYER_ABOUT_VOTE_DOWN = "I don't like this content",
+ REG_PLAYER_ABOUT_VOTE_TT = "Your vote is totally anonymous and can only be seen by this player.",
+ REG_PLAYER_ABOUT_VOTE_TT2 = "You can vote only if the player is online.",
+ REG_PLAYER_ABOUT_VOTE_NO = "No characters linked to this profile seem to be online.\nDo you want to force Total RP 3 to send your vote anyway ?",
+ REG_PLAYER_ABOUT_VOTE_SENDING = "Sending your vote to %s ...",
+ REG_PLAYER_ABOUT_VOTE_SENDING_OK = "Your vote has been sent to %s !",
+ REG_PLAYER_ABOUT_VOTES = "Statistics",
+ REG_PLAYER_ABOUT_VOTES_R = "|cff00ff00%s like this content\n|cffff0000%s dislike this content",
+ REG_PLAYER_ABOUT_EMPTY = "No description",
+ REG_PLAYER_STYLE_RPSTYLE_SHORT = "RP style",
+ REG_PLAYER_STYLE_RPSTYLE = "Roleplay style",
+ REG_PLAYER_STYLE_HIDE = "Do not show",
+ REG_PLAYER_STYLE_WOWXP = "World of Warcraft experience",
+ REG_PLAYER_STYLE_FREQ = "In-character frequence",
+ REG_PLAYER_STYLE_FREQ_1 = "Full-time, no OOC",
+ REG_PLAYER_STYLE_FREQ_2 = "Most of the time",
+ REG_PLAYER_STYLE_FREQ_3 = "Mid-time",
+ REG_PLAYER_STYLE_FREQ_4 = "Casual",
+ REG_PLAYER_STYLE_FREQ_5 = "Full-time OOC, not a RP character",
+ REG_PLAYER_STYLE_PERMI = "With player permission",
+ REG_PLAYER_STYLE_ASSIST = "Roleplay assistance",
+ REG_PLAYER_STYLE_INJURY = "Accept character injury",
+ REG_PLAYER_STYLE_DEATH = "Accept character death",
+ REG_PLAYER_STYLE_ROMANCE = "Accept character romance",
+ REG_PLAYER_STYLE_BATTLE = "Roleplay battle resolution",
+ REG_PLAYER_STYLE_BATTLE_1 = "World of warcraft PVP",
+ REG_PLAYER_STYLE_BATTLE_2 = "TRP roll battle (Not available yet)",
+ REG_PLAYER_STYLE_BATTLE_3 = "/roll battle",
+ REG_PLAYER_STYLE_BATTLE_4 = "Emote battle",
+ REG_PLAYER_STYLE_EMPTY = "No roleplay attribute shared",
+ REG_PLAYER_STYLE_GUILD = "Guild membership",
+ REG_PLAYER_STYLE_GUILD_IC = "IC membership",
+ REG_PLAYER_STYLE_GUILD_OOC = "OOC membership",
+ REG_PLAYER_ALERT_HEAVY_SMALL = "|cffff0000The total size of your profile is quite big.\n|cffff9900You should reduce it.",
+ CO_GENERAL_HEAVY = "Heavy profile alert",
+ CO_GENERAL_HEAVY_TT = "Get an alert when your profile total size exceed a reasonable value.",
+ REG_PLAYER_PEEK = "Miscellaneous",
+ REG_PLAYER_CURRENT = "Currently",
+ REG_PLAYER_CURRENTOOC = "Currently (OOC)",
+ REG_PLAYER_CURRENT_OOC = "This is a OOC information";
+ REG_PLAYER_GLANCE = "At first glance",
+ REG_PLAYER_GLANCE_USE = "Activate this slot",
+ REG_PLAYER_GLANCE_TITLE = "Attribute name",
+ REG_PLAYER_GLANCE_UNUSED = "Unused slot",
+ REG_PLAYER_GLANCE_CONFIG = "\n|cffffff00Click:|r configure slot\n|cffffff00Right-click:|r toggle slot activation\n|cffffff00Drag & drop:|r reorder slots",
+ REG_PLAYER_GLANCE_EDITOR = "Glance editor : Slot %s",
+ REG_PLAYER_GLANCE_BAR_TARGET = "\"At first glance\" presets",
+ REG_PLAYER_GLANCE_BAR_LOAD_SAVE = "Group presets",
+ REG_PLAYER_GLANCE_BAR_SAVE = "Save group as a preset",
+ REG_PLAYER_GLANCE_BAR_LOAD = "Group preset",
+ REG_PLAYER_GLANCE_BAR_EMPTY = "The preset name can't be empty.",
+ REG_PLAYER_GLANCE_BAR_NAME = "Please enter the preset name.\n\n|cff00ff00Note: If the name is already used by another group preset, this another group will be replaced.",
+ REG_PLAYER_GLANCE_BAR_SAVED = "Group preset |cff00ff00%s|r has been created.",
+ REG_PLAYER_GLANCE_BAR_DELETED = "Group preset |cffff9900%s|r deleted.",
+ REG_PLAYER_GLANCE_PRESET = "Load a preset",
+ REG_PLAYER_GLANCE_PRESET_SELECT = "Select a preset",
+ REG_PLAYER_GLANCE_PRESET_SAVE = "Save information as a preset",
+ REG_PLAYER_GLANCE_PRESET_SAVE_SMALL = "Save as a preset",
+ REG_PLAYER_GLANCE_PRESET_CATEGORY = "Preset category",
+ REG_PLAYER_GLANCE_PRESET_NAME = "Preset name",
+ REG_PLAYER_GLANCE_PRESET_NONE = "Clear slot",
+ REG_PLAYER_GLANCE_PRESET_ALERT1 = "Please enter a category and a name",
+ REG_PLAYER_GLANCE_PRESET_ALERT2 = "There is already a preset called %s",
+ REG_PLAYER_TUTO_ABOUT_COMMON = [[|cff00ff00Character theme:|r
+You can choose a |cffffff00theme|r for your character. Think of it as an |cffffff00ambiance music for reading your character description|r.
+
+|cff00ff00Background:|r
+This is a |cffffff00background texture|r for your character description.
+
+|cff00ff00Template:|r
+The chosen template defines |cffffff00the general layout and writing possibilities|r for your description.
+|cffff9900Only the selected template is visible by others, so you don't have to fill them all.|r
+Once a template is selected, you can open this tutorial again to have more help about each template.]],
+ REG_PLAYER_TUTO_ABOUT_T1 = [[This template allows you to |cff00ff00freely structure your description|r.
+
+The description doesn't have to be limited to your character |cffff9900physical description|r. Feel free to indicate parts from his |cffff9900background|r or details about his |cffff9900personality|r.
+
+With this template you can use the formatting tools to access several layout parameters like |cffffff00texts sizes, colors and alignments|r.
+These tools also allow you to insert |cffffff00images, icons or links to external web sites|r.]],
+ REG_PLAYER_TUTO_ABOUT_T2 = [[This template is more structured and consist of |cff00ff00a list of independant frames|r.
+
+Each frame is caracterized by an |cffffff00icon, a background and a text|r. Note that you can use some text tags in these frames, like the color and the icon text tags.
+
+The description doesn't have to be limited to your character |cffff9900physical description|r. Feel free to indicate parts from his |cffff9900background|r or details about his |cffff9900personality|r.]],
+ REG_PLAYER_TUTO_ABOUT_T3 = [[This template is cut in 3 sections: |cff00ff00Physical description, personality and history|r.
+
+You don't have to fill all the frames, |cffff9900if you leave an empty frame it won't be shown on your description|r.
+
+Each frame is caracterized by an |cffffff00icon, a background and a text|r. Note that you can use some text tags in these frames, like the color and the icon text tags.]],
+ REG_PLAYER_TUTO_ABOUT_MISC_1 = [[This section provides you |cffffff005 slots|r with which you can describe |cff00ff00the most important pieces of information about your character|r.
+
+These slots will be visible on the |cffffff00"At first glance bar"|r when someone selects your character.
+
+|cff00ff00Hint: You can drag & drop slots to reorder them.|r
+It also works on the |cffffff00"At first glance bar"|r!]],
+ REG_PLAYER_TUTO_ABOUT_MISC_3 = [[This section contains |cffffff00a list of flags|r to answer a lot of |cffffff00common questions people could ask about you, your character and the way you want to play him/her|r.]],
+ REG_RELATION = "Relationship",
+ REG_RELATION_BUTTON_TT = "Relation: %s\n|cff00ff00%s\n\n|cffffff00Click to display possible actions",
+ REG_RELATION_UNFRIENDLY = "Unfriendly",
+ REG_RELATION_NONE = "None",
+ REG_RELATION_NEUTRAL = "Neutral",
+ REG_RELATION_BUSINESS = "Business",
+ REG_RELATION_FRIEND = "Friendly",
+ REG_RELATION_LOVE = "Love",
+ REG_RELATION_FAMILY = "Family",
+ REG_RELATION_UNFRIENDLY_TT = "%s clearly doesn't like %s.",
+ REG_RELATION_NONE_TT = "%s doesn't know %s.",
+ REG_RELATION_NEUTRAL_TT = "%s doesn't feel anything particular toward %s.",
+ REG_RELATION_BUSINESS_TT = "%s and %s are in a business relationship.",
+ REG_RELATION_FRIEND_TT = "%s considers %s a friend.",
+ REG_RELATION_LOVE_TT = "%s is in love with %s !",
+ REG_RELATION_FAMILY_TT = "%s shares blood bound with %s.",
+ REG_RELATION_TARGET = "|cffffff00Click: |rChange relation",
+ REG_REGISTER = "Directory",
+ REG_REGISTER_CHAR_LIST = "Characters list",
+ REG_TT_GUILD_IC = "IC member",
+ REG_TT_GUILD_OOC = "OOC member",
+ REG_TT_LEVEL = "Level %s %s",
+ REG_TT_REALM = "Realm: |cffff9900%s",
+ REG_TT_GUILD = "%s of |cffff9900%s",
+ REG_TT_TARGET = "Target: |cffff9900%s",
+ REG_TT_NOTIF = "Unread description",
+ REG_TT_IGNORED = "< Character is ignored >",
+ REG_TT_IGNORED_OWNER = "< Owner is ignored >",
+ REG_LIST_CHAR_TITLE = "Character list",
+ REG_LIST_CHAR_SEL = "Selected character",
+ REG_LIST_CHAR_TT = "Click to show page",
+ REG_LIST_CHAR_TT_RELATION = "Relation:\n|cff00ff00%s",
+ REG_LIST_CHAR_TT_CHAR = "Bounded WoW character(s):",
+ REG_LIST_CHAR_TT_CHAR_NO = "Not bounded to any character",
+ REG_LIST_CHAR_TT_DATE = "Last seen date: |cff00ff00%s|r\nLast seen location: |cff00ff00%s|r",
+ REG_LIST_CHAR_TT_GLANCE = "At first glance",
+ REG_LIST_CHAR_TT_NEW_ABOUT = "Unread description",
+ REG_LIST_CHAR_TT_IGNORE = "Ignored character(s)",
+ REG_LIST_CHAR_FILTER = "Characters: %s / %s",
+ REG_LIST_CHAR_EMPTY = "No character",
+ REG_LIST_CHAR_EMPTY2 = "No character matches your selection",
+ REG_LIST_CHAR_IGNORED = "Ignored",
+ REG_LIST_IGNORE_TITLE = "Ignored list",
+ REG_LIST_IGNORE_EMPTY = "No ignored character",
+ REG_LIST_IGNORE_TT = "Reason:\n|cff00ff00%s\n\n|cffffff00Click to remove from ignore list",
+ REG_LIST_PETS_FILTER = "Companions: %s / %s",
+ REG_LIST_PETS_TITLE = "Companion list",
+ REG_LIST_PETS_EMPTY = "No companion",
+ REG_LIST_PETS_EMPTY2 = "No companion matches your selection",
+ REG_LIST_PETS_TOOLTIP = "Has been seen on",
+ REG_LIST_PETS_TOOLTIP2 = "Has been seen with",
+ REG_LIST_PET_NAME = "Companion's name",
+ REG_LIST_PET_TYPE = "Companion's type",
+ REG_LIST_PET_MASTER = "Master's name",
+ REG_LIST_FILTERS = "Filters",
+ REG_LIST_FILTERS_TT = "|cffffff00Click:|r Apply filters\n|cffffff00Right-Click:|r Clear filters",
+ REG_LIST_REALMONLY = "This realm only",
+ REG_LIST_GUILD = "Character's guild",
+ REG_LIST_NAME = "Character's name",
+ REG_LIST_FLAGS = "Flags",
+ REG_LIST_ACTIONS_PURGE = "Purge register",
+ REG_LIST_ACTIONS_PURGE_ALL = "Remove all profiles",
+ REG_LIST_ACTIONS_PURGE_ALL_COMP_C = "This purge will remove all companions from the directory.\n\n|cff00ff00%s companions.",
+ REG_LIST_ACTIONS_PURGE_ALL_C = "This purge will remove all profiles and linked characters from the directory.\n\n|cff00ff00%s characters.",
+ REG_LIST_ACTIONS_PURGE_TIME = "Profiles not seen for 1 month",
+ REG_LIST_ACTIONS_PURGE_TIME_C = "This purge will remove all profiles whose has not been seen for a month.\n\n|cff00ff00%s",
+ REG_LIST_ACTIONS_PURGE_UNLINKED = "Profiles not bounded to a character",
+ REG_LIST_ACTIONS_PURGE_UNLINKED_C = "This purge will remove all profiles whose are not bounded to a WoW character.\n\n|cff00ff00%s",
+ REG_LIST_ACTIONS_PURGE_IGNORE = "Profiles from ignored characters",
+ REG_LIST_ACTIONS_PURGE_IGNORE_C = "This purge will remove all profiles linked to a ignored WoW character.\n\n|cff00ff00%s",
+ REG_LIST_ACTIONS_PURGE_EMPTY = "No profile to purge.",
+ REG_LIST_ACTIONS_PURGE_COUNT = "%s profiles will be removed.",
+ REG_LIST_ACTIONS_MASS = "Action on %s selected profiles",
+ REG_LIST_ACTIONS_MASS_REMOVE = "Remove profiles",
+ REG_LIST_ACTIONS_MASS_REMOVE_C = "This action will remove |cff00ff00%s selected profile(s)|r.",
+ REG_LIST_ACTIONS_MASS_IGNORE = "Ignore profiles",
+ REG_LIST_ACTIONS_MASS_IGNORE_C = [[This action will add |cff00ff00%s character(s)|r to the ignore list.
+
+You can optionally enter the reason below. This is a personal note, it will serves as a reminder.]],
+ REG_LIST_CHAR_TUTO_ACTIONS = "This column allows you to select multiple characters and perform an action on all of them.",
+ REG_LIST_CHAR_TUTO_LIST = [[The first column shows the character's name.
+
+The second column shows the relation between these characters and your current character.
+
+The last column is for various flags. (ignored ..etc.)]],
+ REG_LIST_CHAR_TUTO_FILTER = [[You can filter the character list.
+
+The |cff00ff00name filter|r will perform a search on the profile full name (first name + last name) but also on any bounded WoW characters.
+
+The |cff00ff00guild filter|r will search on guild name from bounded WoW characters.
+
+The |cff00ff00realm only filter|r will show only profiles bounded to a WoW character of your current realm.]],
+ REG_LIST_NOTIF_ADD = "New profile discovered for |cff00ff00%s",
+ REG_LIST_NOTIF_ADD_CONFIG = "New profile discovered",
+ REG_LIST_NOTIF_ADD_NOT = "This profile doesn't exist anymore.",
+ REG_COMPANION_LINKED = "The companion %s is now linked to the profile %s.",
+ REG_COMPANION = "Companion",
+ REG_COMPANIONS = "Companions",
+ REG_COMPANION_BOUNDS = "Bounds",
+ REG_COMPANION_TARGET_NO = "Your target is not a valid pet, minion, ghoul, mage elemental or a renamed battle pet.",
+ REG_COMPANION_BOUND_TO = "Bound to ...",
+ REG_COMPANION_UNBOUND = "Unbound from ...",
+ REG_COMPANION_LINKED_NO = "The companion %s is no more linked to any profile.",
+ REG_COMPANION_BOUND_TO_TARGET = "Target",
+ REG_COMPANION_BROWSER_BATTLE = "Battle pet browser",
+ REG_COMPANION_BROWSER_MOUNT = "Mount browser",
+ REG_COMPANION_PROFILES = "Companions profiles",
+ REG_COMPANION_TF_PROFILE = "Companion profile",
+ REG_COMPANION_TF_PROFILE_MOUNT = "Mount profile",
+ REG_COMPANION_TF_NO = "No profile",
+ REG_COMPANION_TF_CREATE = "Create new profile",
+ REG_COMPANION_TF_UNBOUND = "Unlink from profile",
+ REG_COMPANION_TF_BOUND_TO = "Select a profile",
+ REG_COMPANION_TF_OPEN = "Open page",
+ REG_COMPANION_TF_OWNER = "Owner: %s",
+ REG_COMPANION_INFO = "Information",
+ REG_COMPANION_NAME = "Name",
+ REG_COMPANION_TITLE = "Title",
+ REG_COMPANION_NAME_COLOR = "Name color",
+ REG_MSP_ALERT = [[|cffff0000WARNING
+
+You can't have simultaneously more than one addon using the Mary Sue Protocol, as they would be in conflict.|r
+
+Currently loaded: |cff00ff00%s
+
+|cffff9900Therefore the MSP support for Total RP3 will be disabled.|r
+
+If you don't want TRP3 to be your MSP addon and don't want to see this alert again, you can disable the Mary Sue Protocol module in the TRP3 Settings -> Module status.]],
+ REG_COMPANION_PAGE_TUTO_C_1 = "Consult",
+ REG_COMPANION_PAGE_TUTO_E_1 = "This is |cff00ff00your companion main information|r.\n\nAll these information will appear on |cffff9900your companion's tooltip|r.",
+ REG_COMPANION_PAGE_TUTO_E_2 = [[This is |cff00ff00your companion description|r.
+
+It isn't limited to |cffff9900physical description|r. Feel free to indicate parts from his |cffff9900background|r or details about his |cffff9900personality|r.
+
+There are a lot of ways to customize the description.
+You can choose a |cffffff00background texture|r for the description. You can also use the formatting tools to access several layout parameters like |cffffff00texts sizes, colors and alignments|r.
+These tools also allow you to insert |cffffff00images, icons or link to external web site|r.]],
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- CONFIGURATION
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ CO_CONFIGURATION = "Settings",
+ CO_GENERAL = "General settings",
+ CO_GENERAL_CHANGELOCALE_ALERT = "Reload the interface in order to change the language to %s now ?\n\nIf not, the language will be changed on the next connection.",
+ CO_GENERAL_LOCALE = "Addon locale",
+ CO_GENERAL_COM = "Communication",
+ CO_GENERAL_BROADCAST = "Use broadcast channel",
+ CO_GENERAL_BROADCAST_TT = "The broadcast channel is used by a lot of features. Disabling it will disable all the feature like characters position on the map, playing local sounds, stashes and signposts access...",
+ CO_GENERAL_BROADCAST_C = "Broadcast channel name",
+ CO_GENERAL_NOTIF = "Notifications",
+ CO_GENERAL_MISC = "Miscellaneous",
+ CO_GENERAL_TT_SIZE = "Info tooltip text size",
+ CO_GENERAL_NEW_VERSION = "Update alert",
+ CO_GENERAL_NEW_VERSION_TT = "Get an alert when a new version is available.",
+ CO_GENERAL_UI_SOUNDS = "UI sounds",
+ CO_GENERAL_UI_SOUNDS_TT = "Activate the UI sounds (when opening windows, switching tabs, clicking buttons).",
+ CO_GENERAL_UI_ANIMATIONS = "UI animations",
+ CO_GENERAL_UI_ANIMATIONS_TT = "Activate the UI animations.",
+ CO_TOOLTIP = "Tooltip settings",
+ CO_TOOLTIP_USE = "Use characters/companions tooltip",
+ CO_TOOLTIP_COMBAT = "Hide during combat",
+ CO_TOOLTIP_CHARACTER = "Characters tooltip",
+ CO_TOOLTIP_ANCHORED = "Anchored frame",
+ CO_TOOLTIP_ANCHOR = "Anchor point",
+ CO_TOOLTIP_HIDE_ORIGINAL = "Hide original tooltip",
+ CO_TOOLTIP_MAINSIZE = "Main font size",
+ CO_TOOLTIP_SUBSIZE = "Secondary font size",
+ CO_TOOLTIP_TERSIZE = "Tertiary font size",
+ CO_TOOLTIP_SPACING = "Show spacing",
+ CO_TOOLTIP_SPACING_TT = "Places spaces to lighten the tooltip, in the style of MyRoleplay tooltip.",
+ CO_TOOLTIP_PETS = "Companions tooltip",
+ CO_TOOLTIP_OWNER = "Show owner",
+ CO_TOOLTIP_PETS_INFO = "Show companion info",
+ CO_TOOLTIP_COMMON = "Common settings",
+ CO_TOOLTIP_ICONS = "Show icons",
+ CO_TOOLTIP_FT = "Show full title",
+ CO_TOOLTIP_RACE = "Show race, class and level",
+ CO_TOOLTIP_REALM = "Show realm",
+ CO_TOOLTIP_GUILD = "Show guild info",
+ CO_TOOLTIP_TARGET = "Show target",
+ CO_TOOLTIP_TITLE = "Show title",
+ CO_TOOLTIP_CLIENT = "Show client",
+ CO_TOOLTIP_NOTIF = "Show notifications",
+ CO_TOOLTIP_NOTIF_TT = "The notifications line is the line containing the client version, the unread description marker and the 'At first glance' marker.",
+ CO_TOOLTIP_RELATION = "Show relationship color",
+ CO_TOOLTIP_RELATION_TT = "Set the character tooltip border to a color representing the relation.",
+ CO_TOOLTIP_CURRENT = "Show \"current\" information",
+ CO_TOOLTIP_CURRENT_SIZE = "Max \"current\" information length",
+ CO_TOOLTIP_PROFILE_ONLY = "Use only if target has a profile",
+ CO_REGISTER = "Register settings",
+ CO_REGISTER_ABOUT_VOTE = "Use voting system",
+ CO_REGISTER_ABOUT_VOTE_TT = "Enables the voting system, allowing you to vote ('like' or 'unlike') for other's descriptions and allowing them to do the same for you.",
+ CO_REGISTER_AUTO_ADD = "Auto add new players",
+ CO_REGISTER_AUTO_ADD_TT = "Automatically add new players you encounter to the register.",
+ CO_MODULES = "Modules status",
+ CO_MODULES_VERSION = "Version: %s",
+ CO_MODULES_ID = "Module ID: %s",
+ CO_MODULES_STATUS = "Status: %s",
+ CO_MODULES_STATUS_0 = "Missing dependencies",
+ CO_MODULES_STATUS_1 = "Loaded",
+ CO_MODULES_STATUS_2 = "Disabled",
+ CO_MODULES_STATUS_3 = "Total RP 3 update required",
+ CO_MODULES_STATUS_4 = "Error on initialization",
+ CO_MODULES_STATUS_5 = "Error on startup",
+ CO_MODULES_TT_NONE = "No dependencies";
+ CO_MODULES_TT_DEPS = "Dependencies";
+ CO_MODULES_TT_TRP = "%sFor Total RP 3 build %s minimum.|r",
+ CO_MODULES_TT_DEP = "\n%s- %s (version %s)|r",
+ CO_MODULES_TT_ERROR = "\n\n|cffff0000Error:|r\n%s";
+ CO_MODULES_TUTO = [[A module is a independent feature that can be enable or disable.
+
+Possible status:
+|cff00ff00Loaded:|r The module is enabled and loaded.
+|cff999999Disabled:|r The module is disabled.
+|cffff9900Missing dependencies:|r Some dependencies are not loaded.
+|cffff9900TRP update required:|r The module required a more recent version of TRP3.
+|cffff0000Error on init or on startup:|r The module loading sequence failed. The module will likely create errors !
+
+|cffff9900When disabling a module, a UI reload is necessary.]],
+ CO_MODULES_SHOWERROR = "Show error",
+ CO_MODULES_DISABLE = "Disable module",
+ CO_MODULES_ENABLE = "Enable module",
+ CO_TOOLBAR = "Frames settings",
+ CO_TOOLBAR_CONTENT = "Toolbar settings",
+ CO_TOOLBAR_ICON_SIZE = "Icons size",
+ CO_TOOLBAR_MAX = "Max icons per line",
+ CO_TOOLBAR_MAX_TT = "Set to 1 if you want to display the bar vertically !",
+ CO_TOOLBAR_CONTENT_CAPE = "Cape switch",
+ CO_TOOLBAR_CONTENT_HELMET = "Helmet switch",
+ CO_TOOLBAR_CONTENT_STATUS = "Player status (AFK/DND)",
+ CO_TOOLBAR_CONTENT_RPSTATUS = "Character status (IC/OOC)",
+ CO_TOOLBAR_SHOW_ON_LOGIN = "Show toolbar on login",
+ CO_TOOLBAR_SHOW_ON_LOGIN_HELP = "If you don't want the toolbar to be displayed on login, you can disable this option.",
+ CO_TARGETFRAME = "Target frame settings",
+ CO_TARGETFRAME_USE = "Display conditions",
+ CO_TARGETFRAME_USE_TT = "Determines in which conditions the target frame should be shown on target selection.",
+ CO_TARGETFRAME_USE_1 = "Always",
+ CO_TARGETFRAME_USE_2 = "Only when IC",
+ CO_TARGETFRAME_USE_3 = "Never (Disabled)",
+ CO_TARGETFRAME_ICON_SIZE = "Icons size",
+ CO_MINIMAP_BUTTON = "Minimap button",
+ CO_MINIMAP_BUTTON_SHOW_TITLE = "Show minimap button",
+ CO_MINIMAP_BUTTON_SHOW_HELP = [[If you are using an other add-on to display Total RP 3's minimap button (FuBar, Titan, Bazooka) you can remove the button from the minimap.
+
+|cff00ff00Reminder : You can open Total RP 3 using /trp3 switch main|r]],
+ CO_MINIMAP_BUTTON_FRAME = "Frame to anchor",
+ CO_MINIMAP_BUTTON_RESET = "Reset position",
+ CO_MINIMAP_BUTTON_RESET_BUTTON = "Reset",
+ CO_ANCHOR_TOP = "Top",
+ CO_ANCHOR_TOP_LEFT = "Top left",
+ CO_ANCHOR_TOP_RIGHT = "Top right",
+ CO_ANCHOR_BOTTOM = "Bottom",
+ CO_ANCHOR_BOTTOM_LEFT = "Bottom left",
+ CO_ANCHOR_BOTTOM_RIGHT = "Bottom right",
+ CO_ANCHOR_LEFT = "Left",
+ CO_ANCHOR_RIGHT = "Right",
+ CO_ANCHOR_CURSOR = "Show on cursor",
+ CO_CHAT = "Chat settings",
+ CO_CHAT_MAIN = "Chat main settings",
+ CO_CHAT_MAIN_NAMING = "Naming method",
+ CO_CHAT_MAIN_NAMING_1 = "Keep original names",
+ CO_CHAT_MAIN_NAMING_2 = "Use custom names",
+ CO_CHAT_MAIN_NAMING_3 = "First name + last name",
+ CO_CHAT_MAIN_COLOR = "Use custom colors for names",
+ CO_CHAT_USE = "Used chat channels",
+ CO_CHAT_USE_SAY = "Say channel",
+ CO_CHAT_MAIN_NPC = "NPC talk detection",
+ CO_CHAT_MAIN_NPC_USE = "Use NPC talk detection",
+ CO_CHAT_MAIN_NPC_PREFIX = "NPC talk detection pattern",
+ CO_CHAT_MAIN_NPC_PREFIX_TT = "If a chat line said in SAY, EMOTE, GROUP or RAID channel begins with this prefix, it will be interpreted as a NPC chat.\n\n|cff00ff00By default : \"|| \"\n(without the \" and with a space after the pipe)",
+ CO_CHAT_MAIN_EMOTE = "Emote detection",
+ CO_CHAT_MAIN_EMOTE_USE = "Use emote detection",
+ CO_CHAT_MAIN_EMOTE_PATTERN = "Emote detection pattern",
+ CO_CHAT_MAIN_OOC = "OOC detection",
+ CO_CHAT_MAIN_OOC_USE = "Use OOC detection",
+ CO_CHAT_MAIN_OOC_PATTERN = "OOC detection pattern",
+ CO_CHAT_MAIN_OOC_COLOR = "OOC color",
+ CO_CHAT_MAIN_EMOTE_YELL = "No yelled emote",
+ CO_CHAT_MAIN_EMOTE_YELL_TT = "Do not show *emote* or in yelling.",
+ CO_GLANCE_MAIN = "\"At first glance\" bar",
+ CO_GLANCE_RESET_TT = "Reset the bar position to the bottom left of the anchored frame.",
+ CO_GLANCE_LOCK = "Lock bar",
+ CO_GLANCE_LOCK_TT = "Prevent the bar for being dragged",
+ CO_GLANCE_PRESET_TRP2 = "Use Total RP 2 style positions",
+ CO_GLANCE_PRESET_TRP2_BUTTON = "Use",
+ CO_GLANCE_PRESET_TRP2_HELP = "Shortcut to setup the bar in a TRP2 style : to the right of WoW target frame.",
+ CO_GLANCE_PRESET_TRP3 = "Use Total RP 3 style positions",
+ CO_GLANCE_PRESET_TRP3_HELP = "Shortcut to setup the bar in a TRP3 style : to the bottom of the TRP3 target frame.",
+ CO_GLANCE_TT_ANCHOR = "Tooltips anchor point",
+ CO_MSP = "Mary Sue Protocol",
+ CO_MSP_T3 = "Use template 3 only",
+ CO_MSP_T3_TT = "Event if you choose another \"about\" template, the template 3 will always be used for MSP compatibility.",
+ CO_NOTIF_NO = "No notification",
+ CO_NOTIF_SIMPLE = "Notification",
+ CO_NOTIF_DOUBLE = "Notification + chat message",
+ CO_NOTIF_TRIPLE = "Notification + chat message + raid alert",
+ CO_WIM = "|cffff9900Whisper channels are disabled.",
+ CO_WIM_TT = "You are using |cff00ff00WIM|r, the handling for whisper channels is disabled for compatibility purpose",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- TOOLBAR AND UI BUTTONS
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ TB_TOOLBAR = "Toolbar",
+ TB_SWITCH_TOOLBAR = "Switch toolbar",
+ TB_SWITCH_CAPE_ON = "Cloak: |cff00ff00Shown",
+ TB_SWITCH_CAPE_OFF = "Cloak: |cffff0000Hidden",
+ TB_SWITCH_CAPE_1 = "Show cloak",
+ TB_SWITCH_CAPE_2 = "Hide cloak",
+ TB_SWITCH_HELM_ON = "Helm: |cff00ff00Shown",
+ TB_SWITCH_HELM_OFF = "Helm: |cffff0000Hidden",
+ TB_SWITCH_HELM_1 = "Show helmet",
+ TB_SWITCH_HELM_2 = "Hide helmet",
+ TB_GO_TO_MODE = "Switch to %s mode",
+ TB_NORMAL_MODE = "Normal",
+ TB_DND_MODE = "Do not disturb",
+ TB_AFK_MODE = "Away",
+ TB_STATUS = "Player",
+ TB_RPSTATUS_ON = "Character: |cff00ff00In character",
+ TB_RPSTATUS_OFF = "Character: |cffff0000Out of character",
+ TB_RPSTATUS_TO_ON = "Go |cff00ff00in character",
+ TB_RPSTATUS_TO_OFF = "Go |cffff0000out of character",
+ TB_SWITCH_PROFILE = "Switch to another profile",
+ TF_OPEN_CHARACTER = "Show character page",
+ TF_OPEN_COMPANION = "Show companion page",
+ TF_OPEN_MOUNT = "Show mount page",
+ TF_PLAY_THEME = "Play character theme",
+ TF_PLAY_THEME_TT = "|cffffff00Click:|r Play |cff00ff00%s\n|cffffff00Right-click:|r Stop theme",
+ TF_IGNORE = "Ignore player",
+ TF_IGNORE_TT = "|cffffff00Click:|r Ignore player",
+ TF_IGNORE_CONFIRM = "Are you sure you want to ignore this ID ?\n\n|cffffff00%s|r\n\n|cffff7700You can optionally enter below the reason why you ignore it. This is a personal note, it won't be visible by others and will serve as a reminder.",
+ TF_IGNORE_NO_REASON = "No reason",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- PROFILES
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ PR_PROFILEMANAGER_TITLE = "Characters profiles",
+ PR_PROFILEMANAGER_DELETE_WARNING = "Are you sure you want to delete the profile %s?\nThis action cannot be undone and all TRP3 information linked to this profile (Character info, inventory, quest log, applied states ...) will be destroyed !",
+ PR_PROFILE = "Profile",
+ PR_PROFILES = "Profiles",
+ PR_PROFILE_CREATED = "Profile %s created.",
+ PR_CREATE_PROFILE = "Create profile",
+ PR_PROFILE_DELETED = "Profile %s deleted.",
+ PR_PROFILE_HELP = "A profile contains all information about a |cffffff00\"character\"|r as a |cff00ff00roleplay character|r.\n\nA real |cffffff00\"WoW character\"|r can be bounded to only one profile at a time, but can switch from one to another whenever you want.\n\nYou can also bound several |cffffff00\"WoW characters\"|r to the same |cff00ff00profile|r !",
+ PR_PROFILE_DETAIL = "This profile is currently bounded to these WoW characters",
+ PR_DELETE_PROFILE = "Delete profile",
+ PR_DUPLICATE_PROFILE = "Duplicate profile",
+ PR_UNUSED_PROFILE = "This profile is currently not bounded to any WoW character.",
+ PR_PROFILE_LOADED = "The profile %s is loaded.",
+ PR_PROFILEMANAGER_CREATE_POPUP = "Please enter a name for the new profile.\nThe name cannot be empty.",
+ PR_PROFILEMANAGER_DUPP_POPUP = "Please enter a name for the new profile.\nThe name cannot be empty.\n\nThis duplication will not change the character's bounds to %s.",
+ PR_PROFILEMANAGER_EDIT_POPUP = "Please enter a new name for this profile %s.\nThe name cannot be empty.\n\nChanging the name will not change any link between this profile and your characters.",
+ PR_PROFILEMANAGER_ALREADY_IN_USE = "The profile name %s is not available.",
+ PR_PROFILEMANAGER_COUNT = "%s WoW character(s) bounded to this profile.",
+ PR_PROFILEMANAGER_ACTIONS = "Actions",
+ PR_PROFILEMANAGER_SWITCH = "Select profile",
+ PR_PROFILEMANAGER_RENAME = "Rename profile",
+ PR_PROFILEMANAGER_CURRENT = "Current profile",
+ PR_CO_PROFILEMANAGER_TITLE = "Companions profiles",
+ PR_CO_PROFILE_HELP = [[A profile contains all information about a |cffffff00"pet"|r as a |cff00ff00roleplay character|r.
+
+A companion profile can be linked to:
+- A battle pet |cffff9900(only if it has been renamed)|r
+- A hunter pet
+- A warlock minion
+- A mage elemental
+- A death knight ghoul |cffff9900(see below)|r
+
+Just like characters profiles, a |cff00ff00companion profile|r can be linked to |cffffff00several pets|r, and a |cffffff00pet|r can switch easily from one profile to another.
+
+|cffff9900Ghouls:|r As ghouls get a new name each time they are summoned, you will have to re-link the profile to the ghoul for all possible names.]],
+ PR_CO_PROFILE_HELP2 = [[Click here to create a new companion profile.
+
+|cff00ff00To link a profile to a pet (hunter pet, warlock minion ...), just summon the pet, select it and use the target frame to link it to a existing profile (or create a new one).|r]],
+ PR_CO_MASTERS = "Masters",
+ PR_CO_EMPTY = "No companion profile",
+ PR_CO_NEW_PROFILE = "New companion profile",
+ PR_CO_COUNT = "%s pets/mounts bounded to this profile.",
+ PR_CO_UNUSED_PROFILE = "This profile is currently not bounded to any pet or mount.",
+ PR_CO_PROFILE_DETAIL = "This profile is currently bounded to",
+ PR_CO_PROFILEMANAGER_DELETE_WARNING = "Are you sure you want to delete the companion profile %s?\nThis action cannot be undone and all TRP3 information linked to this profile will be destroyed !",
+ PR_CO_PROFILEMANAGER_DUPP_POPUP = "Please enter a name for the new profile.\nThe name cannot be empty.\n\nThis duplication will not change your pets/mounts bounds to %s.",
+ PR_CO_PROFILEMANAGER_EDIT_POPUP = "Please enter a new name for this profile %s.\nThe name cannot be empty.\n\nChanging the name will not change any link between this profile and your pets/mounts.",
+ PR_CO_WARNING_RENAME = "|cffff0000Warning:|r it's strongly recommended that you rename your pet before linking it to a profile.\n\nLink it anyway ?",
+ PR_CO_PET = "Pet",
+ PR_CO_BATTLE = "Battle pet",
+ PR_CO_MOUNT = "Mount",
+ PR_IMPORT_CHAR_TAB = "Characters importer",
+ PR_IMPORT_PETS_TAB = "Companions importer",
+ PR_IMPORT_IMPORT_ALL = "Import all",
+ PR_IMPORT_WILL_BE_IMPORTED = "Will be imported",
+ PR_IMPORT_EMPTY = "No importable profile",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- DASHBOARD
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ DB_STATUS = "Status",
+ DB_STATUS_CURRENTLY_COMMON = "These statuses will be displayed on your character's tooltip. Keep it clear and brief as |cffff9900by default TRP3 players will only see the first 140 characters of them!",
+ DB_STATUS_CURRENTLY = "Currently (IC)",
+ DB_STATUS_CURRENTLY_TT = "Here you can indicate something important about your character.",
+ DB_STATUS_CURRENTLY_OOC = "Other information (OOC)",
+ DB_STATUS_CURRENTLY_OOC_TT = "Here you can indicate something important about you, as a player, or anything out of your character.",
+ DB_STATUS_RP = "Character status",
+ DB_STATUS_RP_IC = "In character",
+ DB_STATUS_RP_IC_TT = "That means you are currently playing your character.\nAll your actions will be interpreted as if it's your character doing them.",
+ DB_STATUS_RP_OOC = "Out of character",
+ DB_STATUS_RP_OOC_TT = "You are out of your character.\nYour actions can't be associated to him/her.",
+ DB_STATUS_XP = "Roleplayer status",
+ DB_STATUS_XP_BEGINNER = "Rookie roleplayer",
+ DB_STATUS_XP_BEGINNER_TT = "This selection will show an icon on your tooltip, indicating\nto others that you are a beginner roleplayer.",
+ DB_STATUS_RP_EXP = "Experienced roleplayer",
+ DB_STATUS_RP_EXP_TT = "Shows that you are an experienced roleplayer.\nIt will not show any specific icon on your tooltip.",
+ DB_STATUS_RP_VOLUNTEER = "Volunteer roleplayer",
+ DB_STATUS_RP_VOLUNTEER_TT = "This selection will show an icon on your tooltip, indicating\nto beginner roleplayers that you are willing to help them.",
+ DB_NOTIFICATIONS = "Dashboard notifications",
+ DB_NOTIFICATIONS_NO = "You haven't any notification",
+ DB_NOTIFICATIONS_CLEAR = "Clear all notifications",
+ DB_NOTIFICATIONS_ALL = "All notification types",
+ DB_TUTO_1 = [[|cffffff00The character status|r indicates if you are currently playing your character's role or not.
+
+|cffffff00The roleplayer status|r allows you to state that you are a beginner or a veteran willing to help rookies !
+
+|cff00ff00These information will be placed in your character's tooltip.]],
+ DB_TUTO_2 = [[Some events will produce notifications. It's a quick way to easily see what happened in Total RP 3.
+
+All notifications are configurable in the |cffff9900general settings page|r.]],
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- COMMON UI TEXTS
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ UI_BKG = "Background %s",
+ UI_ICON_BROWSER = "Icon browser",
+ UI_ICON_BROWSER_HELP = "Copy icon",
+ UI_ICON_BROWSER_HELP_TT = [[While this frame is open you can |cffffff00ctrl + click|r on a icon to copy its name.
+
+This will works:|cff00ff00
+- On any item in your bags
+- On any icon in the spellbook|r]],
+ UI_COMPANION_BROWSER_HELP = "Select a battle pet",
+ UI_COMPANION_BROWSER_HELP_TT = "|cffffff00Warning: |rOnly renamed battle pets can be bound to a profile.\n\n|cff00ff00This section lists these battle pets only.",
+ UI_ICON_SELECT = "Select icon",
+ UI_MUSIC_BROWSER = "Music browser",
+ UI_MUSIC_SELECT = "Select music",
+ UI_COLOR_BROWSER = "Color browser",
+ UI_COLOR_BROWSER_SELECT = "Select color",
+ UI_IMAGE_BROWSER = "Image browser",
+ UI_IMAGE_SELECT = "Select image",
+ UI_FILTER = "Filter",
+ UI_LINK_URL = "http://your.url.here",
+ UI_LINK_TEXT = "Your text here",
+ UI_LINK_WARNING = [[Here's the link URL.
+You can copy/paste it in your web browser.
+
+|cffff0000!! Disclaimer !!|r
+Total RP is not responsible for links leading to harmful content.]],
+ UI_TUTO_BUTTON = "Tutorial mode",
+ UI_TUTO_BUTTON_TT = "Click to toggle on/off the tutorial mode",
+ UI_CLOSE_ALL = "Close all",
+
+ NPC_TALK_SAY_PATTERN = "says: ",
+ NPC_TALK_YELL_PATTERN = "yells: ",
+ NPC_TALK_WHISPER_PATTERN = "whispers: ",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- COMMON TEXTS
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ CM_SHOW = "Show",
+ CM_ACTIONS = "Actions",
+ CM_IC = "IC",
+ CM_OOC = "OOC",
+ CM_CLICK = "Click",
+ CM_R_CLICK = "Right-click",
+ CM_L_CLICK = "Left-click",
+ CM_CTRL = "Ctrl",
+ CM_SHIFT = "Shift",
+ CM_DRAGDROP = "Drag & drop",
+ CM_LINK = "Link",
+ CM_SAVE = "Save",
+ CM_CANCEL = "Cancel",
+ CM_NAME = "Name",
+ CM_VALUE = "Value",
+ CM_UNKNOWN = "Unknown",
+ CM_PLAY = "Play",
+ CM_STOP = "Stop",
+ CM_LOAD = "Load",
+ CM_REMOVE = "Remove",
+ CM_EDIT = "Edit",
+ CM_LEFT = "Left",
+ CM_CENTER = "Center",
+ CM_RIGHT = "Right",
+ CM_COLOR = "Color",
+ CM_ICON = "Icon",
+ CM_IMAGE = "Image",
+ CM_SELECT = "Select",
+ CM_OPEN = "Open",
+ CM_APPLY = "Apply",
+ CM_MOVE_UP = "Move up",
+ CM_MOVE_DOWN = "Move down",
+ CM_CLASS_WARRIOR = "Warrior",
+ CM_CLASS_PALADIN = "Paladin",
+ CM_CLASS_HUNTER = "Hunter",
+ CM_CLASS_ROGUE = "Rogue",
+ CM_CLASS_PRIEST = "Priest",
+ CM_CLASS_DEATHKNIGHT = "Death Knight",
+ CM_CLASS_SHAMAN = "Shaman",
+ CM_CLASS_MAGE = "Mage",
+ CM_CLASS_WARLOCK = "Warlock",
+ CM_CLASS_MONK = "Monk",
+ CM_CLASS_DRUID = "Druid",
+ CM_CLASS_UNKNOWN = "Unknown",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Minimap button
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ MM_SHOW_HIDE_MAIN = "Show/hide the main frame",
+ MM_SHOW_HIDE_SHORTCUT = "Show/hide the toolbar",
+ MM_SHOW_HIDE_MOVE = "Move button",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Browsers
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ BW_COLOR_CODE = "Color code",
+ BW_COLOR_CODE_TT = "You can paste an 6 figures hexadecimal color code here and press Enter.",
+ BW_COLOR_CODE_ALERT = "Wrong hexadecimal code !",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Databroker
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ DTBK_HELMET = "Total RP 3 - Helmet",
+ DTBK_CLOAK = "Total RP 3 - Cloak",
+ DTBK_AFK = "Total RP 3 - AFK/DND",
+ DTBK_RP = "Total RP 3 - IC/OOC",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- Bindings
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ BINDING_NAME_TRP3_TOGGLE = "Toogle main frame";
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = "Toogle toolbar";
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- About TRP3
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ ABOUT_TITLE = "About",
+
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+ -- COMMANDS
+ --*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+ COM_LIST = "List of commands:",
+ COM_SWITCH_USAGE = "Usage: |cff00ff00/trp3 switch main|r to switch main frame or |cff00ff00/trp3 switch toolbar|r to switch the toolbar.",
+ COM_RESET_USAGE = "Usage: |cff00ff00/trp3 reset frames|r to reset all frames positions.",
+ COM_RESET_RESET = "The frames positions have been reset!",
+ },
+};
+
+TRP3_API.locale.registerLocale(LOCALE_EN);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale_esES.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale_esES.lua
new file mode 100644
index 000000000..c055c219f
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale_esES.lua
@@ -0,0 +1,838 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Spanish locale
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+-- Translation by Alnih from WikiErrantes, many thanks to him.
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local LOCALE = {
+ locale = "esES",
+ localeText = "Español",
+ localeContent = {
+ ABOUT_TITLE = "Acerca de",
+ BINDING_NAME_TRP3_TOGGLE = "Mostrar/ocultar la ventana principal",
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = "Mostrar/ocultar barra de herramientas",
+ BW_COLOR_CODE = "Código de color",
+ BW_COLOR_CODE_ALERT = "¡Código hexadecimal incorrecto!",
+ BW_COLOR_CODE_TT = "Pega un código hexadecimal de 6 cifras aquí y presiona Enter.",
+ CM_ACTIONS = "Acciones",
+ CM_APPLY = "Aplicar",
+ CM_CANCEL = "Cancelar",
+ CM_CENTER = "Centro",
+ CM_CLASS_DEATHKNIGHT = "Caballero de la Muerte",
+ CM_CLASS_DRUID = "Druida",
+ CM_CLASS_HUNTER = "Cazador",
+ CM_CLASS_MAGE = "Mago",
+ CM_CLASS_MONK = "Monje",
+ CM_CLASS_PALADIN = "Paladín",
+ CM_CLASS_PRIEST = "Sacerdote",
+ CM_CLASS_ROGUE = "Pícaro",
+ CM_CLASS_SHAMAN = "Chamán",
+ CM_CLASS_UNKNOWN = "Desconocido",
+ CM_CLASS_WARLOCK = "Brujo",
+ CM_CLASS_WARRIOR = "Guerrero",
+ CM_CLICK = "Clic",
+ CM_COLOR = "Color",
+ CM_CTRL = "Ctrl",
+ CM_DRAGDROP = "Arrastras y soltar",
+ CM_EDIT = "Editar",
+ CM_IC = "ER",
+ CM_ICON = "Icono",
+ CM_IMAGE = "Imagen",
+ CM_L_CLICK = "Clic-izquierdo",
+ CM_LEFT = "Izquierda",
+ CM_LINK = "Link",
+ CM_LOAD = "Cargar",
+ CM_MOVE_DOWN = "Mover hacia abajo",
+ CM_MOVE_UP = "Mover hacia arriba",
+ CM_NAME = "Nombre",
+ CM_OOC = "FdR",
+ CM_OPEN = "Abrir",
+ CM_PLAY = "Tocar",
+ CM_R_CLICK = "Clic-derecho",
+ CM_REMOVE = "Suprimir",
+ CM_RIGHT = "Derecha",
+ CM_SAVE = "Guardar",
+ CM_SELECT = "Seleccionar",
+ CM_SHIFT = "Shift",
+ CM_SHOW = "Mostrar",
+ CM_STOP = "Parar",
+ CM_UNKNOWN = "Desconocido",
+ CM_VALUE = "Descripción",
+ CO_ANCHOR_BOTTOM = "Botón",
+ CO_ANCHOR_BOTTOM_LEFT = "Botón izquierdo",
+ CO_ANCHOR_BOTTOM_RIGHT = "Botón derecho",
+ CO_ANCHOR_LEFT = "Izquierda",
+ CO_ANCHOR_RIGHT = "Derecha",
+ CO_ANCHOR_TOP = "Superior",
+ CO_ANCHOR_TOP_LEFT = "Superior izquierda",
+ CO_ANCHOR_TOP_RIGHT = "Superior derecha",
+ CO_CHAT = "Chat",
+ CO_CHAT_MAIN = "Ajustes de chat principal",
+ CO_CHAT_MAIN_COLOR = "Usar colores para los nombres",
+ CO_CHAT_MAIN_EMOTE = "Detección de emociones",
+ CO_CHAT_MAIN_EMOTE_PATTERN = "Patrón detección de emociones",
+ CO_CHAT_MAIN_EMOTE_USE = "Usar detección de emociones",
+ CO_CHAT_MAIN_EMOTE_YELL = "Gritos sin emociones",
+ CO_CHAT_MAIN_EMOTE_YELL_TT = "No mostrar *emote* o en gritos.",
+ CO_CHAT_MAIN_NAMING = "Visualización del nombre",
+ CO_CHAT_MAIN_NAMING_1 = "Mantener nombre original",
+ CO_CHAT_MAIN_NAMING_2 = "Usar nombre personalizado",
+ CO_CHAT_MAIN_NAMING_3 = "Nombre + apellido",
+ CO_CHAT_MAIN_NPC = "Detección de diálogo de PNJ",
+ CO_CHAT_MAIN_NPC_PREFIX = "Patrón detección de diálogo PNJ",
+ CO_CHAT_MAIN_NPC_PREFIX_TT = [=[Si un mensaje enviado por el canal empieza con los prefijos /decir, /emote, /grupo o /banda, se interpreta como un diálogo de PNJ.
+
+|cff00ff00Por defecto: "|| "
+(Sin el " y con un espacio después del I)]=],
+ CO_CHAT_MAIN_NPC_USE = "Usar detección de diálogo de PNJ",
+ CO_CHAT_MAIN_OOC = "Detección de FdR",
+ CO_CHAT_MAIN_OOC_COLOR = "Color de FdR",
+ CO_CHAT_MAIN_OOC_PATTERN = "Patrón de detección de FdR",
+ CO_CHAT_MAIN_OOC_USE = "Usar detección de FdR",
+ CO_CHAT_USE = "Canales de chat usados",
+ CO_CHAT_USE_SAY = "Canal /decir",
+ CO_CONFIGURATION = "Ajustes",
+ CO_GENERAL = "Generales",
+ CO_GENERAL_BROADCAST = "Usar canal de emisión",
+ CO_GENERAL_BROADCAST_C = "Nombre del canal de emisión",
+ CO_GENERAL_BROADCAST_TT = "El canal de emisión es usado para una serie de características. La desactivación deshabilita características como la ubicación en el mapa, sonidos difundidos a nivel local, el acceso a escondrijos y carteles, etc...",
+ CO_GENERAL_CHANGELOCALE_ALERT = [=[¿Deseas actualizar ahora la interfaz con el fin de cambiar el idioma a %s?
+
+Si no es así, el idioma se cambiará en la próxima conexión.]=],
+ CO_GENERAL_COM = "Comunicación",
+ CO_GENERAL_HEAVY = "Alerta de perfil sobrecargado",
+ CO_GENERAL_HEAVY_TT = "Mostrar un aviso cuando el tamaño total del perfil exceda un valor razonable.",
+ CO_GENERAL_LOCALE = "Idioma",
+ CO_GENERAL_MISC = "Varios",
+ CO_GENERAL_NEW_VERSION = "Alerta de actualización",
+ CO_GENERAL_NEW_VERSION_TT = "Mostrar un aviso cuando una nueva versión esté disponible.",
+ CO_GENERAL_NOTIF = "Notificaciones",
+ CO_GENERAL_TT_SIZE = "Info sobre herramientas de texto",
+ CO_GENERAL_UI_ANIMATIONS = "Animaciones de IU",
+ CO_GENERAL_UI_ANIMATIONS_TT = "Activar las animaciones de IU.",
+ CO_GENERAL_UI_SOUNDS = "Sonidos de IU",
+ CO_GENERAL_UI_SOUNDS_TT = "Activar el sonido de IU (al abrir las ventanas, pestañas, clics de botones).",
+ CO_GLANCE_LOCK = "Anclar barra",
+ CO_GLANCE_LOCK_TT = "Ancla la barra para evitar que sea arrastrada.",
+ CO_GLANCE_MAIN = "Barra de \"a primera vista\"",
+ CO_GLANCE_PRESET_TRP2 = "Usar estilo de posición del TRP2",
+ CO_GLANCE_PRESET_TRP2_BUTTON = "Usar",
+ CO_GLANCE_PRESET_TRP2_HELP = "Acceso directo de configuración en el estilo TRP2: a la derecha del marco de objetivo del WoW.",
+ CO_GLANCE_PRESET_TRP3 = "Usar estilo de posición del TRP 3",
+ CO_GLANCE_PRESET_TRP3_HELP = "Acceso directo de configuración en el estilo TRP3: a la parte inferior del marco de objetivo del TRP3.",
+ CO_GLANCE_RESET_TT = "Cambiar la posición a la parte inferior izquierda de la barra del marco de anclaje.",
+ CO_GLANCE_TT_ANCHOR = "Punto de anclaje",
+ CO_MINIMAP_BUTTON = "Botón de minimapa",
+ CO_MINIMAP_BUTTON_FRAME = "Marco de anclaje",
+ CO_MINIMAP_BUTTON_FRAME_TT = [=[Indica que marco utilizar como matriz para el botón.
+
+|cff00ff00Para mover el botón de marco se puede arrastrar y soltar el botón.]=],
+ CO_MINIMAP_BUTTON_LOCK = "Anclar botón",
+ CO_MINIMAP_BUTTON_LOCK_TT = "Ancla el botón para evitar que sea arrastrado.",
+ CO_MINIMAP_BUTTON_RESET = "Restablecer posición",
+ CO_MINIMAP_BUTTON_RESET_BUTTON = "Restablecer",
+ CO_MINIMAP_BUTTON_RESET_TT = "Cambiar el botón de la esquina inferior izquierda del marco anclado.",
+ COM_LIST = "Lista de comandos:",
+ CO_MODULES = "Estado de los módulos",
+ CO_MODULES_DISABLE = "Desactivar módulo",
+ CO_MODULES_ENABLE = "Habilitar módulo",
+ CO_MODULES_ID = "ID del módulo: %s",
+ CO_MODULES_SHOWERROR = "Mostrar error",
+ CO_MODULES_STATUS = "Estado: %s",
+ CO_MODULES_STATUS_0 = "Dependencias faltantes",
+ CO_MODULES_STATUS_1 = "Cargado",
+ CO_MODULES_STATUS_2 = "Inhabilitado",
+ CO_MODULES_STATUS_3 = "Total RP 3 requiere una actualizanción",
+ CO_MODULES_STATUS_4 = "Error en la inicialización",
+ CO_MODULES_STATUS_5 = "Error en el inicio",
+ CO_MODULES_TT_DEP = "%s- %s (versión %s)|r",
+ CO_MODULES_TT_DEPS = "Dependencias",
+ CO_MODULES_TT_ERROR = [=[|cffff0000Error:|r
+%s]=],
+ CO_MODULES_TT_NONE = "No hay dependencias",
+ CO_MODULES_TT_TRP = "%sPara Total RP 3 build %s mínima.|r",
+ CO_MODULES_TUTO = [=[Un módulo es una característica independiente que se puede activar o desactivar.
+
+Estados posibles:
+|cff00ff00Cargado:|r El módulo está habilitado y cargado.
+|cff999999Inhabilitado:|r El módulo está inhabilitado.
+|cffff9900Dependencias faltantes:|r Algunas dependencias no se han cargado.
+|cffff9900TRP requiere una actualizanción:|r El módulo requiere una versión más reciente del TRP3.
+|cffff0000Error en la inicialización o en el inicio:|r La secuencia de carga del módulo ha fallado. ¡El módulo es probable que cree un error!
+
+|cffff9900Al desactivar un módulo, es necesario un reinició de interfaz de usuario.]=],
+ CO_MODULES_VERSION = "Versión: %s",
+ COM_RESET_RESET = "¡La posición de los elementos de interfaz han sido restablecidos!",
+ COM_RESET_USAGE = "Uso: |cff00ff00/trp3 reset frames|r para restablecer todas las posiciones de los elementos de interfaz.",
+ CO_MSP = "Protocolo Mary Sue",
+ CO_MSP_T3 = "Usar sólo la plantilla 3",
+ CO_MSP_T3_TT = "Incluso si usted elige una diferente plantilla para \"acerca de\", la plantilla 3 siempre se utilizará para la compatibilidad con PMS.",
+ COM_SWITCH_USAGE = "Uso: |cff00ff00/trp3 switch main|r para mostrar u ocultar la ventana principal o |cff00ff00/trp3 switch toolbar|r para mostrar u ocultar la barra de herramientas.",
+ CO_NOTIF_DOUBLE = "Notificación + mensaje de chat",
+ CO_NOTIF_NO = "Sin notificación",
+ CO_NOTIF_SIMPLE = "Notificación",
+ CO_NOTIF_TRIPLE = "Notificación + mensaje de chat + alerta de banda",
+ CO_REGISTER = "Registro",
+ CO_REGISTER_ABOUT_VOTE = "Usar sistema de votación",
+ CO_REGISTER_ABOUT_VOTE_TT = "Activar el sistema de votación, permitirá que votes (\"me gusta\" o \"no me gusta\") en las descripciones de los usuarios y que puedan votar en la tuya propia.",
+ CO_REGISTER_AUTO_ADD = "Autoañadir nuevos jugadores",
+ CO_REGISTER_AUTO_ADD_TT = "Añadir automáticamente en el registro los jugadores que te encuentres.",
+ CO_TARGETFRAME = "Ajustes del marco de objetivo",
+ CO_TARGETFRAME_ICON_SIZE = "Tamaño del icono",
+ CO_TARGETFRAME_USE = "Condición de visualización",
+ CO_TARGETFRAME_USE_1 = "Siempre",
+ CO_TARGETFRAME_USE_2 = "Sólo ER",
+ CO_TARGETFRAME_USE_3 = "Nunca (Deshabilitar)",
+ CO_TARGETFRAME_USE_TT = "Determina en que condiciones se mostrará el marco de objetivo.",
+ CO_TOOLBAR = "Marco",
+ CO_TOOLBAR_CONTENT = "Ajustes de barra de herramientas",
+ CO_TOOLBAR_CONTENT_CAPE = "Botón de capa",
+ CO_TOOLBAR_CONTENT_HELMET = "Botón de yelmo",
+ CO_TOOLBAR_CONTENT_RPSTATUS = "Estado del personaje (ER/FdR)",
+ CO_TOOLBAR_CONTENT_STATUS = "Estado del jugador (AUS/NM)",
+ CO_TOOLBAR_ICON_SIZE = "Tamaño de iconos",
+ CO_TOOLBAR_MAX = "Iconos por línea",
+ CO_TOOLBAR_MAX_TT = "¡Se establece en 1 si deseas la barra en posición vertical!",
+ CO_TOOLTIP = "Herramientas",
+ CO_TOOLTIP_ANCHOR = "Punto de anclaje",
+ CO_TOOLTIP_ANCHORED = "Marco anclado",
+ CO_TOOLTIP_CHARACTER = "Herramientas del personaje",
+ CO_TOOLTIP_CLIENT = "Mostrar cliente",
+ CO_TOOLTIP_COMBAT = "Ocultar durante el combate",
+ CO_TOOLTIP_COMMON = "Ajustes comunes",
+ CO_TOOLTIP_CURRENT = "Mostrar información actual",
+ CO_TOOLTIP_CURRENT_SIZE = "Longitud información actual",
+ CO_TOOLTIP_FT = "Mostrar título completo",
+ CO_TOOLTIP_GUILD = "Mostrar hermandad",
+ CO_TOOLTIP_HIDE_ORIGINAL = "Ocultar marco original",
+ CO_TOOLTIP_ICONS = "Mostrar icono",
+ CO_TOOLTIP_MAINSIZE = "Tamaño del texto principal",
+ CO_TOOLTIP_NOTIF = "Mostrar notificaciones",
+ CO_TOOLTIP_NOTIF_TT = "La línea de notificaciones es la línea que contiene la versión del cliente, el marcador de descripción no leída y el marcador de \"a primera vista\".",
+ CO_TOOLTIP_OWNER = "Mostrar propietario",
+ CO_TOOLTIP_PETS = "Herramienta de compañeros",
+ CO_TOOLTIP_PETS_INFO = "Mostrar información",
+ CO_TOOLTIP_PROFILE_ONLY = "Utilizar sólo de tiener un perfil",
+ CO_TOOLTIP_RACE = "Mostrar raza, clase y nivel",
+ CO_TOOLTIP_REALM = "Mostrar reino",
+ CO_TOOLTIP_RELATION = "Mostrar el color de relación",
+ CO_TOOLTIP_RELATION_TT = "Establece el color del borde del personaje según su relación contigo.",
+ CO_TOOLTIP_SPACING = "Mostrar espacios",
+ CO_TOOLTIP_SPACING_TT = "Coloca espacios entre la información del personaje para diferenciar mejor los apartados.",
+ CO_TOOLTIP_SUBSIZE = "Tamaño del texto secundario",
+ CO_TOOLTIP_TARGET = "Mostrar objetivo",
+ CO_TOOLTIP_TERSIZE = "Tamaño del texto terciario",
+ CO_TOOLTIP_TITLE = "Mostrar título",
+ CO_TOOLTIP_USE = "Usar herramientas de personajes/compañeros",
+ CO_WIM = "|cffff9900El canal susurro está desactivado.",
+ CO_WIM_TT = "Estás usando |cff00ff00WIM|r, el uso del canal susurro esta deshabilitado por motivos de compatibilidad.",
+ DB_NOTIFICATIONS = "Panel de notificaciones",
+ DB_NOTIFICATIONS_ALL = "Todas las notificaciones",
+ DB_NOTIFICATIONS_CLEAR = "Eliminar todas las notificaciones",
+ DB_NOTIFICATIONS_NO = "No tienes notificaciones",
+ DB_STATUS = "Estado",
+ DB_STATUS_CURRENTLY = "Actualmente (ER)",
+ DB_STATUS_CURRENTLY_COMMON = "Estos estados se mostraran en la descripción de tú personaje. ¡Se claro y breve |cffff9900Los jugadores con el TRP3 solo verán un máximo de 140 caracteres!",
+ DB_STATUS_CURRENTLY_OOC = "Otra información (FdR)",
+ DB_STATUS_CURRENTLY_OOC_TT = "Aquí puedes indicar algo importante sobre ti, como jugador, o cualquier cosa no relacionada con tu personaje.",
+ DB_STATUS_CURRENTLY_TT = "Aquí puedes indicar cualquier cosa relacionada con tu personaje.",
+ DB_STATUS_RP = "Estado del personaje",
+ DB_STATUS_RP_EXP = "Jugador expermientado",
+ DB_STATUS_RP_EXP_TT = [=[Muestra que eres un jugador de rol experimentado.
+No se mostrará ningún icono en la descripción.]=],
+ DB_STATUS_RP_IC = "En rol",
+ DB_STATUS_RP_IC_TT = [=[Actualmente estás interpretando a tu personaje.
+Todas tus acciones se interpretará que lo hace tu personaje.]=],
+ DB_STATUS_RP_OOC = "Fuera de rol",
+ DB_STATUS_RP_OOC_TT = [=[Actualmente no estás interpretando a tu personaje.
+Todas tus acciones no se asociarán a tu personaje.]=],
+ DB_STATUS_RP_VOLUNTEER = "Jugador voluntario",
+ DB_STATUS_RP_VOLUNTEER_TT = [=[Seleccionarlo mostrará un icono en la descripción, lo que indica
+a nuevos jugadores de rol que que estás dispuesto a ayudarlos]=],
+ DB_STATUS_XP = "Estado del jugador",
+ DB_STATUS_XP_BEGINNER = "Jugador novato",
+ DB_STATUS_XP_BEGINNER_TT = [=[Seleccionarlo mostrará un icono en la descripción, lo que indica
+a otros jugadores de rol que eres un principiante.]=],
+ DB_TUTO_1 = [=[|cffffff00Estado del personaje|r indica si actualmente estás interpretando a tu personaje.
+
+|cffffff00El estado del jugador|r indica si eres un jugador de rol principiante o un veterano dispuesto a ayudar.
+
+|cff00ff00Esta información se colocará en la descripción de tu personaje.]=],
+ DB_TUTO_2 = [=[Algunos eventos producirán notificaciones. Es una forma rápida de ver fácilmente lo que sucede.
+
+Todas las notificaciones se pueden configurar en la |cffff9900página de ajustes general|r.]=],
+ GEN_NEW_VERSION_AVAILABLE = [=[Una nueva versión del Total RP 3 está disponible.
+
+|cffff0000Actual versión: %s
+|c0000ff00Nueva versión: %s|r
+
+|cffff9900Se te recomienda para estar al día.|r
+
+Este mensaje solo se mostrará una vez por sesión y se puede desactivar en los ajustes.]=],
+ GEN_VERSION = "Versión: %s (Build %s)",
+ GEN_WELCOME_MESSAGE = "Gracias por usar Total RP 3 (v %s) ¡Diviértete!",
+ MM_SHOW_HIDE_MAIN = "Mostrar/ocultar marco principal",
+ MM_SHOW_HIDE_MOVE = "Mover botón",
+ MM_SHOW_HIDE_SHORTCUT = "Mostrar/ocultar barra de herramientas",
+ NPC_TALK_SAY_PATTERN = "dice:",
+ NPC_TALK_WHISPER_PATTERN = "susurra:",
+ NPC_TALK_YELL_PATTERN = "grita:",
+ PR_CO_BATTLE = "Compañero",
+ PR_CO_COUNT = "%s mascota/montura ligado a este perfil.",
+ PR_CO_EMPTY = "Sin compañeros",
+ PR_CO_MASTERS = "Dueño",
+ PR_CO_NEW_PROFILE = "Nuevo compañero",
+ PR_CO_PET = "Mascota",
+ PR_CO_PROFILE_DETAIL = "Este perfil está limitado actualmente a",
+ PR_CO_PROFILE_HELP = [=[Un perfil contiene toda la información acerca de una |cffffff00"mascota"|r como un |cff00ff00personaje de rol|r.
+
+Un perfil de compañero puede estar vinculado a:
+-Los compañeros |cffff9900(sólo si se ha cambiado el nombre)|r
+-Las mascotas del cazador
+-Los demonios del brujo
+-Los elementales del mago
+-Los no-muertos del Caballero de la Muerte |cffff9900(Ver abajo)|r
+
+Al igual que los perfiles de los personajes, un |cff00ff00perfil de compañero|r puede estar vinculado a |cffffff00várias mascotas|r, y una |cffffff00mascota|r puede cambiar fácilmente de un perfil a otro.
+
+|cffff9900No-muertos:|r como los no-muertos obtienen un nombre diferente cada vez que son invocados, se tendrá que vincular el perfil para todos los nombres posibles del no-muerto.]=],
+ PR_CO_PROFILE_HELP2 = [=[Haz clic aquí para crear un nuevo perfil de compañero.
+
+|cff00ff00Para vincular un perfil con una mascota, invoca a la mascota, selecciónala y utiliza el marco de destino para vincularlo al perfil existente (o crear uno nuevo):|r]=],
+ PR_CO_PROFILEMANAGER_DELETE_WARNING = [=[¿Estás seguro que deseas eliminar el perfil del compañero %s?
+¡Esta acción no se podrá deshacer y toda la información del perfil TRP3 será destruida!]=],
+ PR_CO_PROFILEMANAGER_DUPP_POPUP = [=[Por favor, introduce el nombre del nuevo perfil.
+El nombre no puede mostrarse vacío.
+
+Esta duplicación no afectará a las mascotas/monturas relacionadas con %s.]=],
+ PR_CO_PROFILEMANAGER_EDIT_POPUP = [=[Por favor, introduce el nuevo nombre para el perfil %s.
+El nombre no puede mostrarse vacío.
+
+Cambiar este nombre no afectará al vinculo entre este perfil y tus monturas/mascotas.]=],
+ PR_CO_PROFILEMANAGER_TITLE = "Perfil de compañeros",
+ PR_CO_UNUSED_PROFILE = "Este perfil actualmente no está limitada a ninguna mascota o montura.",
+ PR_CO_WARNING_RENAME = [=[|cffff0000Advertencia;|r cambia el nombre de la mascota antes de vincularla a un perfil.|r
+
+¿Quieres enlazarla de todas formas?]=],
+ PR_CREATE_PROFILE = "Crear perfil",
+ PR_DELETE_PROFILE = "Borrar perfil",
+ PR_DUPLICATE_PROFILE = "Duplicar perfil",
+ PR_IMPORT_CHAR_TAB = "Importar personajes",
+ PR_IMPORT_EMPTY = "Sin perfiles importables",
+ PR_IMPORT_IMPORT_ALL = "Importar todos",
+ PR_IMPORT_PETS_TAB = "Importar compañeros",
+ PR_IMPORT_WILL_BE_IMPORTED = "Se importarán",
+ PR_PROFILE = "Perfil",
+ PR_PROFILE_CREATED = "El perfil %s ha sido creado.",
+ PR_PROFILE_DELETED = "El perfil %s ha sido eliminado.",
+ PR_PROFILE_DETAIL = "Este perfil actualmente está vinculado a estos personajes del WoW",
+ PR_PROFILE_HELP = [=[Un perfil contiene toda la información de un |cffffff00"personaje"|r como un |cff00ff00personaje de rol|r.
+
+Un |cffffff00"personaje del WoW"|r sólo puede ser vinculado a un solo perfil a la vez, pero puedes cambiar de uno a otro en cualquier momento.]=],
+ PR_PROFILE_LOADED = "El perfil %s se ha cargado.",
+ PR_PROFILEMANAGER_ACTIONS = "Acciones",
+ PR_PROFILEMANAGER_ALREADY_IN_USE = "El nombre del perfil %s no está disponible.",
+ PR_PROFILEMANAGER_COUNT = "%s personaje vinculado a este perfil.",
+ PR_PROFILEMANAGER_CREATE_POPUP = [=[Por favor introduce el nombre para el nuevo perfil.
+El nombre no puede mostrarse vacío.]=],
+ PR_PROFILEMANAGER_CURRENT = "Perfil actual",
+ PR_PROFILEMANAGER_DELETE_WARNING = [=[¿Seguro que deseas eliminar el perfil %s?
+¡Esta acción no se podrá deshacer y toda la información del perfil TRP3 (información del personaje, inventario, registro de misiones, estados aplicados...) será destruida!]=],
+ PR_PROFILEMANAGER_DUPP_POPUP = [=[Por favor introduce el nombre para el nuevo perfil.
+El nombre no puede mostrarse vacío.]=],
+ PR_PROFILEMANAGER_EDIT_POPUP = [=[Por favor, introduce el nuevo nombre para el perfil %s.
+El nombre no puede mostrarse vacío.
+
+Cambiar este nombre no afectará al vinculo entre este perfil y tus personajes.]=],
+ PR_PROFILEMANAGER_RENAME = "Renombrar perfil",
+ PR_PROFILEMANAGER_SWITCH = "Perfil seleccionado",
+ PR_PROFILEMANAGER_TITLE = "Perfiles de personajes",
+ PR_PROFILES = "Perfiles",
+ PR_UNUSED_PROFILE = "Este personaje actualmente no está vinculado a ningún personaje del WoW.",
+ REG_COMPANION = "Compañero",
+ REG_COMPANION_INFO = "Información",
+ REG_COMPANION_NAME = "Nombre",
+ REG_COMPANION_NAME_COLOR = "Color del nombre",
+ REG_COMPANION_PAGE_TUTO_C_1 = "Consulta",
+ REG_COMPANION_PAGE_TUTO_E_1 = [=[Esta es la |cff00ff00información principal del compañero|r.
+
+Toda esta información aparecerá en la |cffff9900descripción de compañero|r.]=],
+ REG_COMPANION_PAGE_TUTO_E_2 = [=[Esta es la |cff00ff00descripción del compañero|r.
+
+No se limita a la |cffff9900descripción física|r. Siéntete libre de indicar parte de su |cffff9900trasfondo|r o detalles de su |cffff9900carácter|r.
+
+Hay muchas maneras de personalizar la descripción.
+Puedes elegir el |cffffff00fondo del texto|r para la descripción. También puedes utilizar las herramientas de formato para acceder a vários parámetros de diseño como el |cffffff00tamaño del texto, color y posicionamiento|r.
+Esta herramienta también permite insertar |cffffff00imagenes, iconos o links externos de sitios web|r.]=],
+ REG_COMPANION_PROFILES = "Perfiles de compañeros",
+ REG_COMPANIONS = "Compañeros",
+ REG_COMPANION_TF_BOUND_TO = "Selecciona un perfil",
+ REG_COMPANION_TF_CREATE = "Crea nuevo perfil",
+ REG_COMPANION_TF_NO = "Sin perfil",
+ REG_COMPANION_TF_OPEN = "Abrir página",
+ REG_COMPANION_TF_OWNER = "Owner: %s",
+ REG_COMPANION_TF_PROFILE = "Perfil de compañero",
+ REG_COMPANION_TF_PROFILE_MOUNT = "Perfil de montura",
+ REG_COMPANION_TF_UNBOUND = "Desvincular perfil",
+ REG_COMPANION_TITLE = "Título",
+ REG_DELETE_WARNING = "¿Seguro que quieres eliminar el perfil %s?",
+ REG_IGNORE_TOAST = "Ignorar personaje",
+ REG_LIST_ACTIONS_MASS = "Acción sobre los %s perfiles seleccionados.",
+ REG_LIST_ACTIONS_MASS_IGNORE = "Ignorar perfiles",
+ REG_LIST_ACTIONS_MASS_IGNORE_C = [=[Esta acción añadirá a |cff00ff00%s personajes|r a la lista de ignorados.
+
+Opcionalmente, puede rellenar la razón de ser ignorado abajo. Esta nota es personal, servirá como recordatorio.]=],
+ REG_LIST_ACTIONS_MASS_REMOVE = "Eliminar perfiles",
+ REG_LIST_ACTIONS_MASS_REMOVE_C = "Esta acción eliminará a |cff00ff00%s perfiles seleccionados|r.",
+ REG_LIST_ACTIONS_PURGE = "Purgar registro",
+ REG_LIST_ACTIONS_PURGE_ALL = "Eliminar todos los perfiles",
+ REG_LIST_ACTIONS_PURGE_ALL_C = [=[Esta purga eliminará todos los perfiles vinculados desde el directorio.
+
+|cff00ff00%s personajes.]=],
+ REG_LIST_ACTIONS_PURGE_ALL_COMP_C = [=[Esta purga eliminará todos los compañeros del directorio.
+
+|cff00ff00%s compañeros.]=],
+ REG_LIST_ACTIONS_PURGE_COUNT = "%s perfiles serán eliminados.",
+ REG_LIST_ACTIONS_PURGE_EMPTY = "No hay perfiles para purgar.",
+ REG_LIST_ACTIONS_PURGE_IGNORE = "Perfiles de personajes ignorados",
+ REG_LIST_ACTIONS_PURGE_IGNORE_C = [=[Esta purga eliminará a todos los perfiles vinculados a un personaje del WoW ignorado.
+
+|cff00ff00%s]=],
+ REG_LIST_ACTIONS_PURGE_TIME = "Perfiles no vistos desde hace 1 mes",
+ REG_LIST_ACTIONS_PURGE_TIME_C = [=[Esta purga eliminará a todos los personajes no vistos desde hace más de un mes.
+
+|cff00ff00%s]=],
+ REG_LIST_ACTIONS_PURGE_UNLINKED = "Perfiles no ligados a un personaje",
+ REG_LIST_ACTIONS_PURGE_UNLINKED_C = [=[Esta purga eliminará todos los perfiles no ligados a un personaje del WoW.
+
+|cff00ff00%s]=],
+ REG_LIST_CHAR_EMPTY = "Sin personajes",
+ REG_LIST_CHAR_EMPTY2 = "Ningún personaje corresponde a tu selección",
+ REG_LIST_CHAR_FILTER = "Personajes: %s / %s",
+ REG_LIST_CHAR_IGNORED = "Ignorado",
+ REG_LIST_CHAR_SEL = "Personaje selecionado",
+ REG_LIST_CHAR_TITLE = "Lista de personajes",
+ REG_LIST_CHAR_TT = "Haz clic para visualizar la página",
+ REG_LIST_CHAR_TT_CHAR = "Personajes del WoW ligados:",
+ REG_LIST_CHAR_TT_CHAR_NO = "No ligado a ningún personaje",
+ REG_LIST_CHAR_TT_DATE = [=[Última fecha de visualizado: |cff00ff00%s|r
+Última localización visualizado: |cff00ff00%s|r
+]=],
+ REG_LIST_CHAR_TT_GLANCE = "A primera vista",
+ REG_LIST_CHAR_TT_IGNORE = "Personaje ignorado",
+ REG_LIST_CHAR_TT_NEW_ABOUT = "Descripción no leida",
+ REG_LIST_CHAR_TT_RELATION = [=[Relación:
+|cff00ff00%s]=],
+ REG_LIST_CHAR_TUTO_ACTIONS = "Esta columna te permite seleccionar múltiples personajes y realizar una acción en conjunto.",
+ REG_LIST_CHAR_TUTO_FILTER = [=[Puedes filtrar la lista de personajes.
+
+El |cff00ff00filtro de nombre|r realizará una búsqueda del nombre completo del perfil (nombre + apellido).
+
+El |cff00ff00filtro de hermandad|r buscará a los personajes del WoW ligados a la hermandad.
+
+El |cff00ff00filtro de sólo del este reino|r mostrará sólo los perfiles de los personajes del reino actual.]=],
+ REG_LIST_CHAR_TUTO_LIST = [=[La primera columna muestra el nombre del los personajes.
+
+La segunda columna muestra la relación entre esos personajes y el tuyo.
+
+La última columna es para varias señales. (ignorados, etc...)]=],
+ REG_LIST_FILTERS = "Filtros",
+ REG_LIST_FILTERS_TT = [=[|cffffff00Clic:|r Aplicar filtro
+|cffffff00Clic izquierdo:|r Limpiar filtro]=],
+ REG_LIST_FLAGS = "Señales",
+ REG_LIST_GUILD = "Hermandad",
+ REG_LIST_IGNORE_EMPTY = "Ningún personaje ignorado",
+ REG_LIST_IGNORE_TITLE = "Lista de ignorados",
+ REG_LIST_IGNORE_TT = [=[Relación:
+|cff00ff00%s
+
+|cffffff00Haz clic para eliminar de la lista de ignorados]=],
+ REG_LIST_NAME = "Nombre",
+ REG_LIST_NOTIF_ADD = "Nuevo perfil descubierto: |cff00ff00%s",
+ REG_LIST_NOTIF_ADD_CONFIG = "Nuevo perfil descubierto",
+ REG_LIST_NOTIF_ADD_NOT = "Este perfil ya no existe.",
+ REG_LIST_PET_MASTER = "Nombre del dueño",
+ REG_LIST_PET_NAME = "Nombre",
+ REG_LIST_PETS_EMPTY = "Sin compañero",
+ REG_LIST_PETS_EMPTY2 = "Ningún personaje corresponde a tu selección",
+ REG_LIST_PETS_FILTER = "Compañeros: %s / %s",
+ REG_LIST_PETS_TITLE = "Lista de compañeros",
+ REG_LIST_PETS_TOOLTIP = "Se ha visto en",
+ REG_LIST_PETS_TOOLTIP2 = "Se ha visto con",
+ REG_LIST_PET_TYPE = "Tipo",
+ REG_LIST_REALMONLY = "Sólo de este reino",
+ REG_MSP_ALERT = [=[|cffff0000ADVERTENCIA
+
+No se puede tener más de un addon utilizando el Protocolo Mary Sue, ya que están en conflicto.|r
+
+Actualmente cargado: |cff00ff00%s
+
+|cffff9900Por lo tanto, se desactivará el apoyo PMS para el Total RP3|r
+
+Si quieres el TRP3 con el complemento PMS y no quieres ver esta alerta de nuevo, puedes desactivarlo en el módulo Protocolo Mary Sue en ajustes de Total RP3 en -> Estado del módulo]=],
+ REG_PLAYER = "Personaje",
+ REG_PLAYER_ABOUT = "Acerca de",
+ REG_PLAYER_ABOUT_ADD_FRAME = "Añadir un marco",
+ REG_PLAYER_ABOUT_EMPTY = "Sin descripción",
+ REG_PLAYER_ABOUT_HEADER = "Etiqueta del título",
+ REG_PLAYER_ABOUT_MUSIC = "Tema del personaje",
+ REG_PLAYER_ABOUT_MUSIC_LISTEN = "Tocar tema",
+ REG_PLAYER_ABOUT_MUSIC_REMOVE = "Deselecciona tema",
+ REG_PLAYER_ABOUT_MUSIC_SELECT = "Seleccionar tema del personaje",
+ REG_PLAYER_ABOUT_MUSIC_SELECT2 = "Seleccionar tema",
+ REG_PLAYER_ABOUT_MUSIC_STOP = "Parar tema",
+ REG_PLAYER_ABOUT_NOMUSIC = "|cffff9900Sin tema",
+ REG_PLAYER_ABOUT_P = "Etiqueta del parágrafo",
+ REG_PLAYER_ABOUT_REMOVE_FRAME = "Eliminar este marco",
+ REG_PLAYER_ABOUTS = "Acerca de %s",
+ REG_PLAYER_ABOUT_SOME = "Escribir texto aquí...",
+ REG_PLAYER_ABOUT_T1_YOURTEXT = "Texto aquí",
+ REG_PLAYER_ABOUT_TAGS = "Herramientas de formato",
+ REG_PLAYER_ABOUT_UNMUSIC = "|cffff9900Tema desconocido",
+ REG_PLAYER_ABOUT_VOTE_DOWN = "No me gusta este contenido",
+ REG_PLAYER_ABOUT_VOTE_NO = [=[No hay personajes vinculados a este perfil.
+¿Deseas mandar el de todas formas el voto?]=],
+ REG_PLAYER_ABOUT_VOTES = "Estadísticas",
+ REG_PLAYER_ABOUT_VOTE_SENDING = "Enviando tu voto para %s...",
+ REG_PLAYER_ABOUT_VOTE_SENDING_OK = "¡Tu voto ha sido enviado a %s!",
+ REG_PLAYER_ABOUT_VOTES_R = [=[|cff00ff00%s Me gusta
+|cffff0000%s No me gusta]=],
+ REG_PLAYER_ABOUT_VOTE_TT = "Tu voto es totalmente anónimo, y solo puede ser visto por este jugador.",
+ REG_PLAYER_ABOUT_VOTE_TT2 = "Puedes votar solo si el jugador está conectado.",
+ REG_PLAYER_ABOUT_VOTE_UP = "Me gusta este contenido",
+ REG_PLAYER_ADD_NEW = "Crear nuevo",
+ REG_PLAYER_AGE = "Edad",
+ REG_PLAYER_AGE_TT = [=[Aquí puedes indicar la edad de tu personaje.
+
+Hay varias maneras de hacer esto:|c0000ff00
+- Numérico,
+- O un adjetivo (Joven, Maduro, Adulto, Venerado, etc...).]=],
+ REG_PLAYER_ALERT_HEAVY_SMALL = [=[|cffff0000El tamaño total de tu perfil es demasiado extenso.
+|cffff9900Debes reducirlo.]=],
+ REG_PLAYER_BIRTHPLACE = "Lugar de nacimiento",
+ REG_PLAYER_BIRTHPLACE_TT = [=[Aquí puedes indicar el lugar de nacimiento de tu personaje. Puede ser una región, una zona o incluso un continente. Tú decides lo preciso que quieres ser.
+
+|c00ffff00Puedes usar el botón de la derecha para configurar tu ubicación actual como lugar de nacimiento.]=],
+ REG_PLAYER_BKG = "Fondo de Características",
+ REG_PLAYER_BKG_TT = "Representa el fondo visual a elegir para tu diseño de Características.",
+ REG_PLAYER_CARACT = "Características",
+ REG_PLAYER_CHANGE_CONFIRM = [=[Tienes datos editados que no han sido guardados
+¿Quieres cambiar de página de todas formas?
+|cffff9900Perderás todos los cambios.]=],
+ REG_PLAYER_CHARACTERISTICS = "Características",
+ REG_PLAYER_CLASS = "Clase",
+ REG_PLAYER_CLASS_TT = [=[Esta es la clase de tu personaje.
+
+|cff00ff00Por ejemplo:|r
+Caballero, Piromante, Nigromante, Tirador de élite, Arcanista...]=],
+ REG_PLAYER_COLOR_CLASS = "Color de clase",
+ REG_PLAYER_COLOR_CLASS_TT = "Esto determina el color en que se visualizará la clase.",
+ REG_PLAYER_COLOR_TT = [=[|cffffff00Clic:|r Seleccionar color
+|cffffff00Clic derecho:|r Descartar color]=],
+ REG_PLAYER_CURRENT = "Actualmente",
+ REG_PLAYER_CURRENTOOC = "Actualmente (FdR)",
+ REG_PLAYER_CURRENT_OOC = "Esta es la información FdR",
+ REG_PLAYER_EYE = "Color de ojos",
+ REG_PLAYER_EYE_TT = [=[Aquí puedes indicar el color de ojos de tu personaje.
+
+Ten en cuenta que aunque tu rostro esté constantemente oculto, vale la pena mencionarlo, por si acaso.]=],
+ REG_PLAYER_FIRSTNAME = "Nombre",
+ REG_PLAYER_FIRSTNAME_TT = [=[Este es el nombre de tu personaje. Este es un campo obligatorio de rellenar, por lo que si no se especifica un nombre, por defecto el nombre del personaje (|cffffff00%s|r) será usado.
+
+¡Puedes utilizar un |c0000ff00apodo|r!]=],
+ REG_PLAYER_FULLTITLE = "Título completo",
+ REG_PLAYER_FULLTITLE_TT = [=[Aquí puedes escribir el título completo de tu personaje. Puede ser una versión más larga del título u otro título completo.
+
+Sin embargo, es posible que quieras evitar repeticiones, en caso de que no haya información adicional que mencionar.]=],
+ REG_PLAYER_GLANCE = "A primera vista",
+ REG_PLAYER_GLANCE_BAR_DELETED = "Restablecer grupo |cffff9900%s|r eliminado.",
+ REG_PLAYER_GLANCE_BAR_EMPTY = "El nombre del predeterminado no puede estar vacío.",
+ REG_PLAYER_GLANCE_BAR_LOAD = "Grupo restablecido",
+ REG_PLAYER_GLANCE_BAR_LOAD_SAVE = "Grupo predeterminado",
+ REG_PLAYER_GLANCE_BAR_NAME = [=[Por favor introduce el nombre del predeterminado.
+
+|cff00ff00Nota: Si el nombre ya es usado por un grupo, será remplazado por este grupo. ]=],
+ REG_PLAYER_GLANCE_BAR_SAVE = "Guardar grupo como predeterminado.",
+ REG_PLAYER_GLANCE_BAR_SAVED = "Grupo predeterminado |cff00ff00%s|r ha sido creado",
+ REG_PLAYER_GLANCE_BAR_TARGET = "\"A primera vista\" predeterminado",
+ REG_PLAYER_GLANCE_CONFIG = [=[|cffffff00Clic:|r configurar ranura
+|cffffff00Clic-derecho:|r activar/desactivar ranura
+|cffffff00Arrastrar y soltar:|r mover ranura]=],
+ REG_PLAYER_GLANCE_EDITOR = "Editor visual: Ranura %s",
+ REG_PLAYER_GLANCE_PRESET = "Cargar predeterminado",
+ REG_PLAYER_GLANCE_PRESET_ALERT1 = "Por favor introduce una categoría y un nombre",
+ REG_PLAYER_GLANCE_PRESET_ALERT2 = "Ya existe un predeterminado llamado %s",
+ REG_PLAYER_GLANCE_PRESET_CATEGORY = "Categoría",
+ REG_PLAYER_GLANCE_PRESET_NAME = "Nombre",
+ REG_PLAYER_GLANCE_PRESET_NONE = "Ranura trasparente",
+ REG_PLAYER_GLANCE_PRESET_SAVE = "Guardar información como un predeterminado",
+ REG_PLAYER_GLANCE_PRESET_SAVE_SMALL = "Guardar",
+ REG_PLAYER_GLANCE_PRESET_SELECT = "Seleccionar predeterminado",
+ REG_PLAYER_GLANCE_TITLE = "Nombre",
+ REG_PLAYER_GLANCE_UNUSED = "Ranura no utilizada",
+ REG_PLAYER_GLANCE_USE = "Activar esta ranura",
+ REG_PLAYER_HEIGHT = "Altura",
+ REG_PLAYER_HEIGHT_TT = [=[Esta es la altura de tu personaje.
+Hay varias maneras de hacer esto:|c0000ff00
+- Numérico: 1,70m, 6'5''...
+- Un calificativo: Alto, bajo...]=],
+ REG_PLAYER_HERE = "Obtener posición",
+ REG_PLAYER_HERE_TT = "Haz clic para obtener la posición",
+ REG_PLAYER_HISTORY = "Trasfondo",
+ REG_PLAYER_ICON = "Icono del personaje",
+ REG_PLAYER_ICON_TT = "Selecciona una representación gráfica para tu personaje.",
+ REG_PLAYER_IGNORE = "Ignorar personajes vinculados (%s)",
+ REG_PLAYER_IGNORE_WARNING = [=[¿Quieres ignorar a estos personajes?
+
+|cffff9900%s
+
+|rOpcionalmente, puedes escribir la razón a continuación. Esta nota servirá como recordatorio.]=],
+ REG_PLAYER_LASTNAME = "Apellido",
+ REG_PLAYER_LASTNAME_TT = "Este es el apellido de tu personaje.",
+ REG_PLAYER_LEFTTRAIT = "Atributo",
+ REG_PLAYER_MISC_ADD = "Añadir un campo adicional",
+ REG_PLAYER_MORE_INFO = "Información adicional",
+ REG_PLAYER_MSP_HOUSE = "Nombre de dinastía",
+ REG_PLAYER_MSP_MOTTO = "Lema",
+ REG_PLAYER_MSP_NICK = "Apodo",
+ REG_PLAYER_NAMESTITLES = "Nombre y títulos",
+ REG_PLAYER_NO_CHAR = "Sin características",
+ REG_PLAYER_PEEK = "Varios",
+ REG_PLAYER_PHYSICAL = "Descripción física",
+ REG_PLAYER_PSYCHO = "Rasgos de personalidad",
+ REG_PLAYER_PSYCHO_Acete = "Asceta",
+ REG_PLAYER_PSYCHO_ADD = "Añadir un rasgo personal",
+ REG_PLAYER_PSYCHO_ATTIBUTENAME_TT = "Nombre del atributo",
+ REG_PLAYER_PSYCHO_Bonvivant = "Vividor",
+ REG_PLAYER_PSYCHO_CHAOTIC = "Caótico",
+ REG_PLAYER_PSYCHO_Chaste = "Casto",
+ REG_PLAYER_PSYCHO_Conciliant = "Ejemplar",
+ REG_PLAYER_PSYCHO_Couard = "Cobarde", -- Needs review
+ REG_PLAYER_PSYCHO_CREATENEW = "Crear un rasgo",
+ REG_PLAYER_PSYCHO_Cruel = "Brutal",
+ REG_PLAYER_PSYCHO_CUSTOM = "Rasgo personalizado",
+ REG_PLAYER_PSYCHO_Egoiste = "Egoísta",
+ REG_PLAYER_PSYCHO_Genereux = "Altruista",
+ REG_PLAYER_PSYCHO_Impulsif = "Impulsivo",
+ REG_PLAYER_PSYCHO_Indulgent = "Indulgente",
+ REG_PLAYER_PSYCHO_LEFTICON_TT = "Establece el icono del atributo de la izquierda",
+ REG_PLAYER_PSYCHO_Loyal = "Legal",
+ REG_PLAYER_PSYCHO_Luxurieux = "Lujurioso",
+ REG_PLAYER_PSYCHO_Misericordieux = "Pacífico",
+ REG_PLAYER_PSYCHO_MORE = "Añadir un punto de \"%s\"",
+ REG_PLAYER_PSYCHO_PERSONAL = "Características personales",
+ REG_PLAYER_PSYCHO_Pieux = "Devoto",
+ REG_PLAYER_PSYCHO_POINT = "Añadir un punto",
+ REG_PLAYER_PSYCHO_Pragmatique = "Renegado",
+ REG_PLAYER_PSYCHO_Rationnel = "Racional",
+ REG_PLAYER_PSYCHO_Reflechi = "Reflexivo",
+ REG_PLAYER_PSYCHO_Rencunier = "Vengativo",
+ REG_PLAYER_PSYCHO_RIGHTICON_TT = "Establece el icono del atributo de la derecha.",
+ REG_PLAYER_PSYCHO_Sincere = "Sincero",
+ REG_PLAYER_PSYCHO_SOCIAL = "Características sociales",
+ REG_PLAYER_PSYCHO_Trompeur = "Embustero",
+ REG_PLAYER_PSYCHO_Valeureux = "Valeroso",
+ REG_PLAYER_RACE = "Raza",
+ REG_PLAYER_RACE_TT = "Aquí va la raza de tu personaje. No está restringido a razas jugables. Hay muchas razas del Warcraft que pueden asumir forma común...",
+ REG_PLAYER_REGISTER = "Información del directorio",
+ REG_PLAYER_RESIDENCE = "Residencia",
+ REG_PLAYER_RESIDENCE_TT = [=[Aquí puedes indicar donde vive el personaje normalmente. Esta podría ser su dirección personal (su casa) o un lugar donde se hospeda.
+Ten en cuenta que si tu personaje es un vagabundo, tendrás que cambiar la información.
+
+|c00ffff00Puedes utilizar el botón de la derecha para fijar la posición actual como residencia.]=],
+ REG_PLAYER_RIGHTTRAIT = "Atributo",
+ REG_PLAYER_SHOWMISC = "Mostrar diversos marcos",
+ REG_PLAYER_SHOWMISC_TT = [=[Verifica si quieres mostrar los campos personalizados para tu personaje.
+
+Si no quieres mostrar los campos personalizados, mantén esta casilla sin marcar y se mantendrá totalmente oculta.]=],
+ REG_PLAYER_SHOWPSYCHO = "Mostrar marco de la personalidad",
+ REG_PLAYER_SHOWPSYCHO_TT = [=[Verifica si quieres utilizar la descripción del personaje.
+
+Si no quieres mostrar la personalidad del personaje mediante este método, mantén esta casilla sin marcar y se mantendrá totalmente oculta.]=],
+ REG_PLAYER_STYLE_ASSIST = "Asistencia de rol",
+ REG_PLAYER_STYLE_BATTLE = "Resolución de batallas de rol",
+ REG_PLAYER_STYLE_BATTLE_1 = "World of warcraft JcJ",
+ REG_PLAYER_STYLE_BATTLE_2 = "Batallas a dados TRP (No disponible)",
+ REG_PLAYER_STYLE_BATTLE_3 = "Batalla a dados",
+ REG_PLAYER_STYLE_BATTLE_4 = "Batalla a emotes",
+ REG_PLAYER_STYLE_DEATH = "Aceptación de muerte",
+ REG_PLAYER_STYLE_EMPTY = "Sin atributos de rol compartidos",
+ REG_PLAYER_STYLE_FREQ = "Frecuencia de rol",
+ REG_PLAYER_STYLE_FREQ_1 = "Todo el tiempo",
+ REG_PLAYER_STYLE_FREQ_2 = "La mayoría de las veces",
+ REG_PLAYER_STYLE_FREQ_3 = "Mitad tiempo",
+ REG_PLAYER_STYLE_FREQ_4 = "A veces",
+ REG_PLAYER_STYLE_FREQ_5 = "No es un personaje de rol",
+ REG_PLAYER_STYLE_GUILD = "Miembro de hermandad",
+ REG_PLAYER_STYLE_GUILD_IC = "Miembro ER",
+ REG_PLAYER_STYLE_GUILD_OOC = "Miembro FdR",
+ REG_PLAYER_STYLE_HIDE = "No mostrar",
+ REG_PLAYER_STYLE_INJURY = "Aceptación de heridas",
+ REG_PLAYER_STYLE_PERMI = "Con el permiso del jugador",
+ REG_PLAYER_STYLE_ROMANCE = "Aceptación de romances",
+ REG_PLAYER_STYLE_RPSTYLE = "Estilo de rol",
+ REG_PLAYER_STYLE_RPSTYLE_SHORT = "Estilo ER",
+ REG_PLAYER_STYLE_WOWXP = "Experiencia de World of Warcraft",
+ REG_PLAYER_TITLE = "Título",
+ REG_PLAYER_TITLE_TT = [=[El título de tu personaje es el título con el que tu personaje es llamado normalmente. Evita colocar títulos largos, para ello se ha de utilizar el título completo.
+
+Ejemplos de |c0000ff00títulos apropiados|r:
+|c0000ff00- Condesa,
+- Marqués,
+- Mago,
+- Señor,
+- etc.
+|rEjemplo de |cffff0000títulos inapropiados|r:
+|cffff0000- Condesa de las Marismas del Norte,
+- Mago de la Torre de Ventormenta,
+- Diplomático de los Draenei,
+- etc.]=],
+ REG_PLAYER_TRP2_PIERCING = "Piercings",
+ REG_PLAYER_TRP2_TATTOO = "Tatuajes",
+ REG_PLAYER_TRP2_TRAITS = "Fisionomía",
+ REG_PLAYER_TUTO_ABOUT_COMMON = [=[|cff00ff00Tema del personaje:|r
+Puedes elegir un |cffffff00tema|r por personaje. Piensa en ello como una |cffffff00música de ambientación para la lectura de la descripción de tu personaje.
+
+|cff00ff00Fondo:|r
+Este es el |cffffff00tipo de fondo|r para la descripción de tu personaje.
+
+|cff00ff00Plantilla:|r
+La plantilla elegida define |cffffff00las posibilidades del diseño y escritura generales|r para tu descripción.
+|cffff9900Sólo la plantilla seleccionada se verá, no hace falta rellenar todas.|r
+Una vez elegida la plantilla puedes volver a abrir este tutorial para tener más ayuda acerca de cada plantilla.]=],
+ REG_PLAYER_TUTO_ABOUT_MISC_1 = [=[Esta selección te ofrece |cffffff005 ranuras|r con las que se puede describir |cff00ff00las piezas más importantes de tu personaje|r.
+
+Estos espacios serán visibles en |cffffff00"A primera vista"|r cuando alguien seleccione a tu personaje.
+
+|cff00ff00Sugerencia: Puedes arrastrar y soltar ranuras para reorganizarlas.|r
+¡Esto también funciona en la |cffffff00barra de "A primera vista"|r!
+]=],
+ REG_PLAYER_TUTO_ABOUT_MISC_3 = "Esta sección contiene |cffffff00una lista de notas|r para responder a |cffffff00preguntas comunes que la gente podría preguntarse acerca de ti, sobre tu personaje y la forma en que deseas jugar con él/ella|r.",
+ REG_PLAYER_TUTO_ABOUT_T1 = [=[Esta plantilla te permite |cff00ff00estructurar libremente tu descripción|r.
+
+La descripción no tiene que limitarse a la |cffff9900descripción física|r de tu personaje. Siéntete libre para indicar parte de su |cffff9900trasfondo|r o detalles sobre su |cffff9900personalidad|r.
+
+Con esta plantilla se pueden utilizar las herramientas de formato para acceder a varios parámetros de diseño como |cffffff00tamaño del texto, color o alineamientos|r.
+Esta herramienta también permite insertar |cffffff00imagenes, iconos o links externos de sitios webs|r.]=],
+ REG_PLAYER_TUTO_ABOUT_T2 = [=[Esta plantilla es más estructurada y consiste en |cff00ff00una lista de marcos independientes|r.
+
+Cada marco se caracteriza por un |cffffff00icono, un fondo y un texto|r. Ten en cuenta que puedes utilizar algunas etiquetas de texto en estos recuadros, como el color y las etiquetas de icono de texto.
+
+La descripción no tiene que limitarse a la descripción física|r de tu personaje. Siéntete libre para indicar parte de tu |cffff9900trasfondo|r o detalles sobre tu |cffff9900personalidad|r.]=],
+ REG_PLAYER_TUTO_ABOUT_T3 = [=[Esta plantilla está separada en 3 secciones: |cff00ff00Descripción física, personalidad y trasfondo|r.
+
+No hace falta llenar todos los cuadros, |cffff9900si dejas un cuadro vacío no se mostrará en tu descripción|r.
+
+Cada cuadro se caracteriza por un |cffffff00icono, un fondo y un texto|r. Ten en cuenta que vas a poder utilizar algunas etiquetas de texto en estos cuadros, como el color y las etiquetas de iconos de texto.]=],
+ REG_PLAYER_WEIGHT = "Complexión",
+ REG_PLAYER_WEIGHT_TT = [=[Esta es la forma del cuerpo de tu personaje.
+Por ejemplo podría ser |c0000ff00delgado, gordo o musculoso...|r ¡O simplemente podría ser normal!]=],
+ REG_REGISTER = "Directorio",
+ REG_REGISTER_CHAR_LIST = "Lista de personajes",
+ REG_RELATION = "Relación",
+ REG_RELATION_BUSINESS = "Negocios",
+ REG_RELATION_BUSINESS_TT = "%s y %s tienen una relación de negocios.",
+ REG_RELATION_BUTTON_TT = [=[Relación: %s
+|cff00ff00%s
+
+|cffffff00Haz clic para mostrar las acciones posibles]=],
+ REG_RELATION_FAMILY = "Familiar",
+ REG_RELATION_FAMILY_TT = "%s tiene un lazo de sangre con %s.",
+ REG_RELATION_FRIEND = "Amistad",
+ REG_RELATION_FRIEND_TT = "%s es amigo de %s.",
+ REG_RELATION_LOVE = "Amor",
+ REG_RELATION_LOVE_TT = "¡%s quiere a %s!",
+ REG_RELATION_NEUTRAL = "Neutral",
+ REG_RELATION_NEUTRAL_TT = "%s no siente nada especial por %s.",
+ REG_RELATION_NONE = "Ninguno",
+ REG_RELATION_NONE_TT = "%s no conoce a %s.",
+ REG_RELATION_TARGET = "|cffffff00Clic: |rcambiar relación",
+ REG_RELATION_UNFRIENDLY = "Enemigo",
+ REG_RELATION_UNFRIENDLY_TT = "%s odia a %s.",
+ REG_TT_GUILD = "%s de |cffff9900%s",
+ REG_TT_GUILD_IC = "Miembro ER",
+ REG_TT_GUILD_OOC = "Miembro FdR",
+ REG_TT_IGNORED = "",
+ REG_TT_IGNORED_OWNER = "",
+ REG_TT_LEVEL = "Nivel %s %s",
+ REG_TT_NOTIF = "Descripción no leida",
+ REG_TT_REALM = "Reino: |cffff9900%s",
+ REG_TT_TARGET = "Objetivo: |cffff9900%s",
+ TB_AFK_MODE = "Ausente",
+ TB_DND_MODE = "No molestar",
+ TB_GO_TO_MODE = "Cambiar a modo %s",
+ TB_NORMAL_MODE = "Normal",
+ TB_RPSTATUS_OFF = "Personaje: |cffff0000Fuera de Rol",
+ TB_RPSTATUS_ON = "Personaje: |cff00ff00En Rol",
+ TB_RPSTATUS_TO_OFF = "Cambiar a |cffff0000Fuera de Rol",
+ TB_RPSTATUS_TO_ON = "Cambiar a |cff00ff00En Rol",
+ TB_STATUS = "Jugador",
+ TB_SWITCH_CAPE_1 = "Mostrar capa",
+ TB_SWITCH_CAPE_2 = "Ocultar capa",
+ TB_SWITCH_CAPE_OFF = "Capa: |cffff0000Oculta",
+ TB_SWITCH_CAPE_ON = "Capa: |cff00ff00Visble",
+ TB_SWITCH_HELM_1 = "Mostrar yelmo",
+ TB_SWITCH_HELM_2 = "Ocultar yelmo",
+ TB_SWITCH_HELM_OFF = "Yelmo: |cffff0000Oculto",
+ TB_SWITCH_HELM_ON = "Yelmo: |cff00ff00Visible",
+ TB_SWITCH_PROFILE = "Cambiar a otro perfil",
+ TB_SWITCH_TOOLBAR = "Cambiar barra de herramientas",
+ TB_TOOLBAR = "Barra de herramientas",
+ TF_IGNORE = "Ignorar jugador",
+ TF_IGNORE_CONFIRM = [=[¿Estás seguro que deseas ignorar esta ID?
+
+|cffffff00%s|r
+
+|cffff7700Opcionalmente, puedes escribir debajo la razón por la que le quieres ignorar. Esta es una nota personal, no será visible por otros y servirá como recordatorio.]=],
+ TF_IGNORE_NO_REASON = "No hay razón",
+ TF_IGNORE_TT = "|cffffff00Clic:|r Ignorar jugador",
+ TF_OPEN_CHARACTER = "Mostrar página del personaje",
+ TF_OPEN_COMPANION = "Mostrar página del compañero",
+ TF_PLAY_THEME = "Tocar tema del personaje",
+ TF_PLAY_THEME_TT = [=[|cffffff00Clic:|r Tocar |cff00ff00%s
+|cffffff00Clic-derecho:|r Parar tema]=],
+ UI_BKG = "Fondo %s",
+ UI_CLOSE_ALL = "Cerrar todo",
+ UI_COLOR_BROWSER = "Buscador de color",
+ UI_COLOR_BROWSER_SELECT = "Seleccionar color",
+ UI_FILTER = "Filtro",
+ UI_ICON_BROWSER = "Buscador de icono",
+ UI_ICON_BROWSER_HELP = "Copiar icono",
+ UI_ICON_BROWSER_HELP_TT = [=[Si este marco está abierto puedes hacer |cffffff00ctrl + clic|r en un icono para copiar su nombre.
+
+Esto funcionará en:|cff00ff00
+- Cualquier objeto de tu mochila
+- En cualquier icono del libro de hechizos|r]=],
+ UI_ICON_SELECT = "Seleccionar icono",
+ UI_IMAGE_BROWSER = "Buscador de imagen",
+ UI_IMAGE_SELECT = "Seleccionar imagen",
+ UI_LINK_TEXT = "Tu texto aquí",
+ UI_LINK_URL = "http://tu.url.aquí",
+ UI_LINK_WARNING = [=[Aquí está el enlace URL.
+Puedes copiar/pegar desde tu navegador web.
+
+|cffff0000¡¡Atencion!!|r
+Total RP no es responsable de los enlaces que conducen a contenidos nocivos.
+]=],
+ UI_MUSIC_BROWSER = "Buscador de música",
+ UI_MUSIC_SELECT = "Seleccionar música",
+ UI_TUTO_BUTTON = "Modo tutorial",
+ UI_TUTO_BUTTON_TT = "Haz clic para activar/desactivar el modo tutorial",
+ }
+};
+
+TRP3_API.locale.registerLocale(LOCALE);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale_frFR.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale_frFR.lua
new file mode 100644
index 000000000..7fa609dc3
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale_frFR.lua
@@ -0,0 +1,861 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- French locale
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+-- Copyright 2014 Renaud Parize (Ellypse) (renaud@parize.me)
+-- Thanks to Solanya Stormbreaker ( http://www.curseforge.com/profiles/SolanyaStormbreaker/ )
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local LOCALE = {
+ locale = "frFR",
+ localeText = "Français",
+ localeContent = {
+ ABOUT_TITLE = "À propos",
+ BINDING_NAME_TRP3_TOGGLE = "Afficher/cacher la fenêtre principale",
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = "Afficher/cacher la barre d'outils",
+ BW_COLOR_CODE = "Code couleur",
+ BW_COLOR_CODE_ALERT = "Mauvais code hexadécimal !",
+ BW_COLOR_CODE_TT = "Vous pouvez coller ici un code couleur hexadecimal à 6 caractères et appuyer sur Entrée pour valider.",
+ CM_ACTIONS = "Actions",
+ CM_APPLY = "Appliquer",
+ CM_CANCEL = "Annuler",
+ CM_CENTER = "Centre",
+ CM_CLASS_DEATHKNIGHT = "Chevalier de la mort",
+ CM_CLASS_DRUID = "Druide",
+ CM_CLASS_HUNTER = "Chasseur",
+ CM_CLASS_MAGE = "Mage",
+ CM_CLASS_MONK = "Moine",
+ CM_CLASS_PALADIN = "Paladin",
+ CM_CLASS_PRIEST = "Prêtre",
+ CM_CLASS_ROGUE = "Voleur",
+ CM_CLASS_SHAMAN = "Chaman",
+ CM_CLASS_UNKNOWN = "Inconnu",
+ CM_CLASS_WARLOCK = "Démoniste",
+ CM_CLASS_WARRIOR = "Guerrier",
+ CM_CLICK = "Clic",
+ CM_COLOR = "Couleur",
+ CM_CTRL = "Ctrl",
+ CM_DRAGDROP = "Glisser-déposer",
+ CM_EDIT = "Modifier",
+ CM_IC = "RP",
+ CM_ICON = "Icône",
+ CM_IMAGE = "Image",
+ CM_L_CLICK = "Clic-gauche",
+ CM_LEFT = "Gauche",
+ CM_LINK = "Lien",
+ CM_LOAD = "Charger",
+ CM_MOVE_DOWN = "Déplacer vers le bas",
+ CM_MOVE_UP = "Déplacer vers le haut",
+ CM_NAME = "Nom",
+ CM_OOC = "HRP",
+ CM_OPEN = "Ouvrir",
+ CM_PLAY = "Jouer",
+ CM_R_CLICK = "Clic-droit",
+ CM_REMOVE = "Supprimer",
+ CM_RIGHT = "Droite",
+ CM_SAVE = "Sauver",
+ CM_SELECT = "Choisir",
+ CM_SHIFT = "Maj",
+ CM_SHOW = "Afficher",
+ CM_STOP = "Arrêter",
+ CM_UNKNOWN = "Inconnu",
+ CM_VALUE = "Valeur",
+ CO_ANCHOR_BOTTOM = "Bas",
+ CO_ANCHOR_BOTTOM_LEFT = "Bas-gauche",
+ CO_ANCHOR_BOTTOM_RIGHT = "Bas-droite",
+ CO_ANCHOR_CURSOR = "Afficher sur le curseur",
+ CO_ANCHOR_LEFT = "Gauche",
+ CO_ANCHOR_RIGHT = "Droite",
+ CO_ANCHOR_TOP = "Haut",
+ CO_ANCHOR_TOP_LEFT = "Haut-gauche",
+ CO_ANCHOR_TOP_RIGHT = "Haut-droite",
+ CO_CHAT = "Discussions",
+ CO_CHAT_MAIN = "Paramètres principaux de discussions",
+ CO_CHAT_MAIN_COLOR = "Utiliser les couleurs personnalisées pour les noms",
+ CO_CHAT_MAIN_EMOTE = "Détection des émotes",
+ CO_CHAT_MAIN_EMOTE_PATTERN = "Schéma de détection des émotes",
+ CO_CHAT_MAIN_EMOTE_USE = "Utiliser la détection des émotes",
+ CO_CHAT_MAIN_EMOTE_YELL = "Pas d'émotes criées",
+ CO_CHAT_MAIN_EMOTE_YELL_TT = "Ne pas afficher *emote* ou en /crier.",
+ CO_CHAT_MAIN_NAMING = "Méthode d'affichage des noms",
+ CO_CHAT_MAIN_NAMING_1 = "Garder le nom original",
+ CO_CHAT_MAIN_NAMING_2 = "Utiliser les noms personnalisés",
+ CO_CHAT_MAIN_NAMING_3 = "Prénom + nom",
+ CO_CHAT_MAIN_NPC = "Détection des dialogues de PNJ",
+ CO_CHAT_MAIN_NPC_PREFIX = "Schéma de détection des dialogues de PNJ",
+ CO_CHAT_MAIN_NPC_PREFIX_TT = [=[Si un message envoyé sur le canal /dire, /emote, /groupe ou /raid commence par ce préfix, il sera interprété comme dialogue de PNJ.
+
+|cff00ff00Par défaut : "|| "
+(sans les " et avec un espace après le | )]=],
+ CO_CHAT_MAIN_NPC_USE = "Utiliser la détection des dialogues de PNJ",
+ CO_CHAT_MAIN_OOC = "Détection du HRP",
+ CO_CHAT_MAIN_OOC_COLOR = "Couleur du HRP",
+ CO_CHAT_MAIN_OOC_PATTERN = "Schéma de détection du HRP",
+ CO_CHAT_MAIN_OOC_USE = "Utiliser la détection du HRP",
+ CO_CHAT_USE = "Canaux de discussion utilisés",
+ CO_CHAT_USE_SAY = "Canal /dire",
+ CO_CONFIGURATION = "Paramètres",
+ CO_GENERAL = "Général",
+ CO_GENERAL_BROADCAST = "Utiliser le canal de diffusion",
+ CO_GENERAL_BROADCAST_C = "Nom du canal de diffusion",
+ CO_GENERAL_BROADCAST_TT = "Le canal de diffusion est utilisé pour de nombreuses fonctionnalités. Le désactiver désactivera également les fonctionnalités comme la location sur la carte, les sons diffusés localement, l'accès aux planques et aux panneaux, etc.",
+ CO_GENERAL_CHANGELOCALE_ALERT = [=[Changer la langue pour %s ?
+Cela provoquera une rechargement de l'interface.]=],
+ CO_GENERAL_COM = "Communication",
+ CO_GENERAL_HEAVY = "Alerte de profil lourd",
+ CO_GENERAL_HEAVY_TT = "Afficher une alerte lorsque la taille du profil dépasse une valeur raisonnable",
+ CO_GENERAL_LOCALE = "Langue de l'add-don",
+ CO_GENERAL_MISC = "Divers",
+ CO_GENERAL_NEW_VERSION = "Alerte de mise-à-jour",
+ CO_GENERAL_NEW_VERSION_TT = "Afficher une alerte lorsqu'une nouvelle version est disponible.",
+ CO_GENERAL_NOTIF = "Notifications",
+ CO_GENERAL_TT_SIZE = "Taille du texte de l'infobulle",
+ CO_GENERAL_UI_ANIMATIONS = "Animations d'interface",
+ CO_GENERAL_UI_ANIMATIONS_TT = "Activer les animations d'interface",
+ CO_GENERAL_UI_SOUNDS = "Effets sonores d'interface",
+ CO_GENERAL_UI_SOUNDS_TT = "Activer les effets sonores d'interface (à l'ouverture des fenêtres, aux changements d'onglets ou aux clics des boutons).",
+ CO_GLANCE_LOCK = "Verrouiller la barre",
+ CO_GLANCE_LOCK_TT = "Empêche la barre de pouvoir être déplacée",
+ CO_GLANCE_MAIN = "Barre \"Coup d’œil\"",
+ CO_GLANCE_PRESET_TRP2 = "Utiliser les positions dans le style de Total RP 2",
+ CO_GLANCE_PRESET_TRP2_BUTTON = "Utiliser",
+ CO_GLANCE_PRESET_TRP2_HELP = "Raccourci pour configurer la barre dans le style de TRP2 : à droite du portrait de la cible.",
+ CO_GLANCE_PRESET_TRP3 = "Utiliser les positions dans le style de Total RP 3",
+ CO_GLANCE_PRESET_TRP3_HELP = "Raccourci pour configurer la barre dans le style de TRP3 : en-dessous du portrait de la cible.",
+ CO_GLANCE_RESET_TT = "Réinitialiser la position de la barre en bas à gauche du cadre d'ancrage.",
+ CO_GLANCE_TT_ANCHOR = "Point d'ancrage des infobulles",
+ CO_MINIMAP_BUTTON = "Bouton de la minicarte",
+ CO_MINIMAP_BUTTON_FRAME = "Cadre d'ancrage",
+ CO_MINIMAP_BUTTON_RESET = "Réinitialiser la position",
+ CO_MINIMAP_BUTTON_RESET_BUTTON = "Réinitialiser",
+ CO_MINIMAP_BUTTON_SHOW_HELP = "Si vous utilisez un autre add-on pour afficher le bouton de la mini-carte de Total RP 3 (FuBar, Titan, Bazooka) vous pouvez cacher le bouton par défaut.",
+ CO_MINIMAP_BUTTON_SHOW_TITLE = "Afficher le bouton de la mini-carte",
+ COM_LIST = "Liste des commandes :",
+ CO_MODULES = "Statut des modules",
+ CO_MODULES_DISABLE = "Désactiver le module",
+ CO_MODULES_ENABLE = "Activer le module",
+ CO_MODULES_ID = "Identifiant du module: %s",
+ CO_MODULES_SHOWERROR = "Afficher l'erreur",
+ CO_MODULES_STATUS = "Statut: %s",
+ CO_MODULES_STATUS_0 = "Dépendances manquantes",
+ CO_MODULES_STATUS_1 = "Chargé",
+ CO_MODULES_STATUS_2 = "Désactivé",
+ CO_MODULES_STATUS_3 = "Mise à jour de Total RP 3 requise",
+ CO_MODULES_STATUS_4 = "Erreur à l'initialisation",
+ CO_MODULES_STATUS_5 = "Erreur au démarrage",
+ CO_MODULES_TT_DEP = "%s- %s (version %s)|r",
+ CO_MODULES_TT_DEPS = "Dépendances",
+ CO_MODULES_TT_ERROR = [=[
+|cffff0000Erreur:|r
+%s]=],
+ CO_MODULES_TT_NONE = "Pas de dépendances",
+ CO_MODULES_TT_TRP = "%sPour Total RP 3 version %s minimum.|r",
+ CO_MODULES_TUTO = [=[Un module est une fonctionnalité indépendante qui peut être activé ou désactivé.
+
+Statuts possibles:
+|cff00ff00Chargé:|r Le module est activé et chargé.
+|cff999999Désactivé:|r Le module est désactivé.
+|cffff9900Dépendances manquantes:|r Certaines dépendances ne sont pas chargées.
+|cffff9900Mise à jour de TRP requise:|r Le module requiert une version plus récente de TRP3.
+|cffff0000Erreur à l'initialisation ou au démarrage:|r La séquence de chargement du module a échoué. Le module créera sans doute des erreurs !
+
+|cffff9900Lorsque vous désactivez un module, il est nécessaire de recharger l'interface.]=],
+ CO_MODULES_VERSION = "Version: %s",
+ COM_RESET_RESET = "La position des éléments de l'interface a été ré-initialisée.",
+ COM_RESET_USAGE = "Utilisation : |cff00ff00/trp3 reset frames|r pour ré-initialiser la position des éléments de l'interface.",
+ CO_MSP = "Mary Sue Protocol",
+ CO_MSP_T3 = "Utiliser uniquement le modèle 3",
+ CO_MSP_T3_TT = "Même si vous choisissez un autre modèle \"À propos\", le modèle 3 sera toujours utilisé pour la compatibilité avec MSP.",
+ COM_SWITCH_USAGE = "Utilisation: |cff00ff00/trp3 switch main|r pour afficher ou masquer la fenêtre principale ou |cff00ff00/trp3 switch toolbar|r pour afficher ou masquer la barre d'outils.",
+ CO_NOTIF_DOUBLE = "Notification + message dans la fenêtre de discussion",
+ CO_NOTIF_NO = "Pas de notification",
+ CO_NOTIF_SIMPLE = "Notification",
+ CO_NOTIF_TRIPLE = "Notification + message dans la fenêtre de discussion + alerte de raid",
+ CO_REGISTER = "Registre",
+ CO_REGISTER_ABOUT_VOTE = "Utiliser le système de vote",
+ CO_REGISTER_ABOUT_VOTE_TT = "Active le système de vote, vous permettant de voter (\"j'aime\" ou \"je n'aime pas\") pour les descriptions des autres et leur permettant de faire de même pour vous.",
+ CO_REGISTER_AUTO_ADD = "Ajouter automatiquement les nouveaux joueurs",
+ CO_REGISTER_AUTO_ADD_TT = "Ajouter automatiquement les nouveaux joueurs que vous rencontrez au registre.",
+ CO_TARGETFRAME = "Paramètres du cadre de la cible",
+ CO_TARGETFRAME_ICON_SIZE = "Taille des icônes",
+ CO_TARGETFRAME_USE = "Conditions d'affichage",
+ CO_TARGETFRAME_USE_1 = "Toujours",
+ CO_TARGETFRAME_USE_2 = "Uniquement quand le personnage est joué",
+ CO_TARGETFRAME_USE_3 = "Jamais (Désactivé)",
+ CO_TARGETFRAME_USE_TT = "Détermine les conditions d'affichage du cadre de la cible lors de la sélection d'une cible.",
+ CO_TOOLBAR = "Cadres",
+ CO_TOOLBAR_CONTENT = "Paramètres de la barre d'outils",
+ CO_TOOLBAR_CONTENT_CAPE = "Affichage de la cape",
+ CO_TOOLBAR_CONTENT_HELMET = "Affichage du casque",
+ CO_TOOLBAR_CONTENT_RPSTATUS = "Statut du personnage (RP/HRP)",
+ CO_TOOLBAR_CONTENT_STATUS = "Statut du joueur (ABS/NPD)",
+ CO_TOOLBAR_ICON_SIZE = "Taille des icônes",
+ CO_TOOLBAR_MAX = "Nombre maximum d'icônes par ligne",
+ CO_TOOLBAR_MAX_TT = "Réglez à 1 si vous désirez afficher la barre verticalement !",
+ CO_TOOLBAR_SHOW_ON_LOGIN = "Afficher la barre d'outils à la connexion",
+ CO_TOOLBAR_SHOW_ON_LOGIN_HELP = "Si vous ne souhaitez plus que la barre d'outils de Total RP 3 s'affiche automatiquement à la connexion, vous pouvez décocher cette option.",
+ CO_TOOLTIP = "Infobulles",
+ CO_TOOLTIP_ANCHOR = "Point d'ancrage",
+ CO_TOOLTIP_ANCHORED = "Cadre ancré",
+ CO_TOOLTIP_CHARACTER = "Infobulle de personnages",
+ CO_TOOLTIP_CLIENT = "Afficher le client",
+ CO_TOOLTIP_COMBAT = "Cacher durant un combat",
+ CO_TOOLTIP_COMMON = "Paramètres généraux",
+ CO_TOOLTIP_CURRENT = "Afficher l'information \"actuellement\"",
+ CO_TOOLTIP_CURRENT_SIZE = "Longueur maximale de l'information \"actuellement\"",
+ CO_TOOLTIP_FT = "Afficher le titre complet",
+ CO_TOOLTIP_GUILD = "Afficher l'information de la guilde",
+ CO_TOOLTIP_HIDE_ORIGINAL = "Masquer l'infobulle originale",
+ CO_TOOLTIP_ICONS = "Afficher les icônes",
+ CO_TOOLTIP_MAINSIZE = "Taille de la police principale",
+ CO_TOOLTIP_NOTIF = "Afficher les notifications",
+ CO_TOOLTIP_NOTIF_TT = "La ligne des notifications est la ligne comprenant la version du client, l'indication de description non lue et l'indication 'Coup d'œil'",
+ CO_TOOLTIP_OWNER = "Afficher le propriétaire",
+ CO_TOOLTIP_PETS = "Infobulle de compagnons",
+ CO_TOOLTIP_PETS_INFO = "Afficher l'information du compagnon",
+ CO_TOOLTIP_PROFILE_ONLY = "Utiliser uniquement si la cible a un profil",
+ CO_TOOLTIP_RACE = "Afficher la race, la classe et le niveau",
+ CO_TOOLTIP_REALM = "Afficher le royaume",
+ CO_TOOLTIP_RELATION = "Afficher la couleur de la relation",
+ CO_TOOLTIP_RELATION_TT = "Colorer la bordure de l'infobulle en fonction de la relation",
+ CO_TOOLTIP_SPACING = "Afficher les espaces",
+ CO_TOOLTIP_SPACING_TT = "Ajoute des espaces pour aérer l'infobulle, dans le style de MyRolePlay.",
+ CO_TOOLTIP_SUBSIZE = "Taille de la police secondaire",
+ CO_TOOLTIP_TARGET = "Afficher la cible",
+ CO_TOOLTIP_TERSIZE = "Taille de la police tertiaire",
+ CO_TOOLTIP_TITLE = "Afficher le titre",
+ CO_TOOLTIP_USE = "Utiliser les infobulles de personnages/compagnons",
+ CO_WIM = "|cffff9900Les canaux de chuchotement sont désactivés.",
+ CO_WIM_TT = "Vous utilisez |cff00ff00WIM|r, le support des canaux de chuchotement est désactivé pour des raisons de compatibilité.",
+ DB_NOTIFICATIONS = "Notifications",
+ DB_NOTIFICATIONS_ALL = "Tous les types de notifications",
+ DB_NOTIFICATIONS_CLEAR = "Nettoyer toutes les notifications",
+ DB_NOTIFICATIONS_NO = "Vous n'avez aucune notification",
+ DB_STATUS = "Statut",
+ DB_STATUS_CURRENTLY = "Actuellement (RP)",
+ DB_STATUS_CURRENTLY_COMMON = "Ces statuts seront affichés dans l'infobulle de votre personnage. Restez clair et bref, |cffff9900par défaut les utilisateurs de Total RP 3 verront uniquement les 140 premiers caractères !",
+ DB_STATUS_CURRENTLY_OOC = "Autres informations (HRP)",
+ DB_STATUS_CURRENTLY_OOC_TT = "Vous pouvez indiquer ici quelque chose d'important sur vous, le joueur, ou autre chose hors de votre personnage.",
+ DB_STATUS_CURRENTLY_TT = "Vous pouvez indiquer ici quelque chose d'important sur votre personnage.",
+ DB_STATUS_RP = "Statut du personnage",
+ DB_STATUS_RP_EXP = "Rôliste confirmé",
+ DB_STATUS_RP_EXP_TT = [=[Montre que vous êtes un rôliste confirmé.
+Cela n'affichera aucune icône spécifique sur votre bulle d'aide.]=],
+ DB_STATUS_RP_IC = "Personnage joué",
+ DB_STATUS_RP_IC_TT = [=[Cela signifie que vous jouez actuellement votre personnage.
+Toutes vos actions seront interprétées comme si votre personnage les effectuait.]=],
+ DB_STATUS_RP_OOC = "Hors du personnage",
+ DB_STATUS_RP_OOC_TT = [=[Vous n'êtes pas dans votre personnage.
+Vos actions ne lui seront pas associées.]=],
+ DB_STATUS_RP_VOLUNTEER = "Rôliste volontaire",
+ DB_STATUS_RP_VOLUNTEER_TT = [=[Ce choix affichera une icône dans votre infobulle, indiquant
+aux joueurs débutants que vous êtes enclin à les aider.]=],
+ DB_STATUS_XP = "Statut roleplay",
+ DB_STATUS_XP_BEGINNER = "Rôliste débutant",
+ DB_STATUS_XP_BEGINNER_TT = [=[Ce choix affichera une icône dans votre infobulle, indiquant
+aux autres que vous débutez dans le roleplay.]=],
+ DB_TUTO_1 = [=[|cffffff00Le statut du personnage|r indique si vous jouez actuellement le rôle de votre personnage ou non.
+
+|cffffff00Le statut rolepay|r vous permet d'indiquer que vous êtes un débutant ou un vétéran désireux d'aider les novices !
+
+|cff00ff00Cette information sera placée dans la bulle d'aide de votre personnage.]=],
+ DB_TUTO_2 = [=[Certains événements produisent des notifications. C'est un moyen rapide de voir facilement ce qu'il se passe dans Total RP 3.
+
+Toutes les notifications sont configurables dans la |cffff9900page des paramètres généraux|r.]=],
+ DTBK_AFK = "Total RP 3 - ABS/NPD",
+ DTBK_CLOAK = "Total RP 3 - Cape",
+ DTBK_HELMET = "Total RP 3 - Casque",
+ DTBK_RP = "Total RP 3 - RP/HRP",
+ GEN_NEW_VERSION_AVAILABLE = [=[Une nouvelle version pour Total RP 3 est disponible.
+
+|cffff0000Votre version: %s
+|c0000ff00Nouvelle version: %s|r
+
+|cffff9900Nous vous recommandons fortement de garder l'addon à jour.|r
+
+Ce message ne s'affichera qu'une seule fois par session et peut être désactivé dans les paramètres.]=],
+ GEN_VERSION = "Version: %s (Build %s)",
+ GEN_WELCOME_MESSAGE = "Merci d'utiliser Total RP 3 (v %s) ! Amusez-vous bien !",
+ MM_SHOW_HIDE_MAIN = "Afficher/cacher la fenêtre principale",
+ MM_SHOW_HIDE_MOVE = "Déplacer le bouton",
+ MM_SHOW_HIDE_SHORTCUT = "Afficher/cacher la barre d'outils",
+ NPC_TALK_SAY_PATTERN = "dit :",
+ NPC_TALK_WHISPER_PATTERN = "chuchotte :",
+ NPC_TALK_YELL_PATTERN = "crie :",
+ PR_CO_BATTLE = "Compagnon",
+ PR_CO_COUNT = "%s familiers/montures liées à ce profil.",
+ PR_CO_EMPTY = "Pas de profil compagnon",
+ PR_CO_MASTERS = "Maîtres",
+ PR_CO_MOUNT = "Monture",
+ PR_CO_NEW_PROFILE = "Nouveau profil compagnon",
+ PR_CO_PET = "Familier",
+ PR_CO_PROFILE_DETAIL = "Ce profil est actuellement lié à",
+ PR_CO_PROFILE_HELP = [=[Le profil contient toutes les informations sur un |cffffff00"familier"|r comme un |cff00ff00personnage roleplay|r.
+
+Un profil de familier peut être lié à:
+- Une mascotte de combat |cffff9900(uniquement si elle a été renommée)|r
+- Un familier de chasseur
+- Un serviteur de démoniste
+- Un élémentaire de mage
+- Une goule de chevalier de la mort |cffff9900(voir en-dessous)|r
+
+À l'instar des profils de personnages, un |cff00ff00profil de compagnon|r peut être lié à |cffffff00plusieurs familiers|r, et un |cffffff00familier|r peut passer facilement d'un profil à un autre.
+
+|cffff9900Goules:|r Les goules obtenant un nom différent à chaque invocation, il est nécessaire de lié le profil à la goule pour tous les noms générés.]=],
+ PR_CO_PROFILE_HELP2 = [=[Cliquer ici pour créer un nouveau profil de compagnon.
+
+|cff00ff00Pour lier un profil à un familier, invoquez juste le familier, sélectionnez-le et utilisez le cadre de cible pour le lier à un profil existant (ou en créer un nouveau).|r]=],
+ PR_CO_PROFILEMANAGER_DELETE_WARNING = [=[Êtes-vous sûr(e) de vouloir supprimer le profil compagnon %s ?
+Cette action est irréversible et toutes les informations liées à ce profil seront détruites !]=],
+ PR_CO_PROFILEMANAGER_DUPP_POPUP = [=[Veuillez entrer le nom pour le nouveau profil.
+Le nom ne peut pas être vide.
+
+Cette duplication ne change pas les familiers/montures liés à %s.]=],
+ PR_CO_PROFILEMANAGER_EDIT_POPUP = [=[Veuillez entrer le nouveau nom pour ce profile %s.
+Le nom ne peut pas être vide.
+
+Changer le nom ne modifie pas les liens entre ce profil et vos familiers/montures.]=],
+ PR_CO_PROFILEMANAGER_TITLE = "Profils de compagnons",
+ PR_CO_UNUSED_PROFILE = "Ce profil n'est actuellement lié à aucun familier ou monture.",
+ PR_CO_WARNING_RENAME = [=[|cffff0000Attention:|r il est fortement recommandé que vous renommiez votre familier avant de le lier à un profil.
+
+Le lier quand même ?]=],
+ PR_CREATE_PROFILE = "Créer un profil",
+ PR_DELETE_PROFILE = "Supprimer le profil",
+ PR_DUPLICATE_PROFILE = "Dupliquer le profil",
+ PR_IMPORT_CHAR_TAB = "Importateur de personnages",
+ PR_IMPORT_EMPTY = "Aucun profil disponible",
+ PR_IMPORT_IMPORT_ALL = "Tout importer",
+ PR_IMPORT_PETS_TAB = "Importateur de compagnons",
+ PR_IMPORT_WILL_BE_IMPORTED = "Sera importé",
+ PR_PROFILE = "Profil",
+ PR_PROFILE_CREATED = "Profil %s créé.",
+ PR_PROFILE_DELETED = "Profil %s supprimé.",
+ PR_PROFILE_DETAIL = "Ce profil est actuellement lié à ces personnages WoW",
+ PR_PROFILE_HELP = [=[Un profil contient toutes les informations à propos d'un |cffffff00"personnage"|r en tant que |cff00ff00personnage roleplay|r.
+
+Un |cffffff00"personnage WoW"|r réel ne peut être lié qu'à un seul profil à la fois, mais peut passer d'un profil à un autre à votre convenance.
+
+Vous pouvez aussi lier plusieurs |cffffff00"personnages WoW"|r au même |cff00ff00profil|r !]=],
+ PR_PROFILE_LOADED = "Le profil %s est chargé.",
+ PR_PROFILEMANAGER_ACTIONS = "Actions",
+ PR_PROFILEMANAGER_ALREADY_IN_USE = "Le nom de profil %s n'est pas disponible.",
+ PR_PROFILEMANAGER_COUNT = "%s personnage(s) WoW lié(s) à ce profil.",
+ PR_PROFILEMANAGER_CREATE_POPUP = [=[Veuillez entrer un nom pour le nouveau profil.
+Ce nom ne peut pas être vide.]=],
+ PR_PROFILEMANAGER_CURRENT = "Profil actuel",
+ PR_PROFILEMANAGER_DELETE_WARNING = [=[Êtes-vous sûr de vouloir supprimer le profil %s?
+Cette action est irréversible et toutes les informations TRP3 liées à ce profil (Informations du personnage, inventaire, journal de quêtes, états actifs ...) seront effacées !]=],
+ PR_PROFILEMANAGER_DUPP_POPUP = [=[Veuillez entrer un nom pour le nouveau profil.
+Ce nom ne peut pas être vide.
+
+Cette duplication ne changera pas les liens du personnage à %s.]=],
+ PR_PROFILEMANAGER_EDIT_POPUP = [=[Veuillez entrer un nom pour le nouveau profil.
+Ce nom ne peut pas être vide.
+
+Changer le nom ne changera aucun lien entre ce profil et vos personnages]=],
+ PR_PROFILEMANAGER_RENAME = "Renommer le profil",
+ PR_PROFILEMANAGER_SWITCH = "Choisir le profil",
+ PR_PROFILEMANAGER_TITLE = "Profils de personnages",
+ PR_PROFILES = "Profils",
+ PR_UNUSED_PROFILE = "Ce profil n'est actuellement lié à aucun personnage WoW.",
+ REG_COMPANION = "Compagnon",
+ REG_COMPANION_BOUNDS = "Liens",
+ REG_COMPANION_BOUND_TO = "Lier à ...",
+ REG_COMPANION_BOUND_TO_TARGET = "Cible",
+ REG_COMPANION_BROWSER_BATTLE = "Navigateur de mascottes",
+ REG_COMPANION_BROWSER_MOUNT = "Navigateur de montures",
+ REG_COMPANION_INFO = "Informations",
+ REG_COMPANION_LINKED = "Le compagnon %s est maintenant lié au profil %s.",
+ REG_COMPANION_LINKED_NO = "Le compagnon %s n'est plus lié à un profil.",
+ REG_COMPANION_NAME = "Nom",
+ REG_COMPANION_NAME_COLOR = "Couleur du nom",
+ REG_COMPANION_PAGE_TUTO_C_1 = "Consulter",
+ REG_COMPANION_PAGE_TUTO_E_1 = [=[Ce sont |cff00ff00les informations principales de votre compagnon|r.
+
+Toutes ces informations s'afficheront dans |cffff9900l'infobulle de votre compagnon|r.]=],
+ REG_COMPANION_PAGE_TUTO_E_2 = [=[Ceci est |cff00ff00la description de votre compagnon|r.
+
+Elle n'est pas limitée à sa |cffff9900description physique|r. N'hésitez pas à indiquer des parties de son |cffff9900histoire|r ou des détails sur sa |cffff9900personnalité|r.
+
+Il y a de nombreux moyens pour personnaliser la description.
+Vous pouvez choisir une |cffffff00texture d'arrière-plan|r pour la description. Vous pouvez aussi utiliser les outils de formatage pour accéder à plusieurs paramètres de mise en page, tels que |cffffff00les tailles de texte, les couleurs et les alignements|r.
+Ces outils vous permettent aussi d'insérer |cffffff00 des images, des icônes ou un lien vers un site web externe|r.]=],
+ REG_COMPANION_PROFILES = "Profils de compagnons",
+ REG_COMPANIONS = "Compagnons",
+ REG_COMPANION_TARGET_NO = "Votre cible n'est pas un familier, un démon, une goule, un élémentaire de mage ou une mascotte renommée.",
+ REG_COMPANION_TF_BOUND_TO = "Sélectionner un profil",
+ REG_COMPANION_TF_CREATE = "Créer un nouveau profil",
+ REG_COMPANION_TF_NO = "Pas de profil",
+ REG_COMPANION_TF_OPEN = "Ouvrir la page",
+ REG_COMPANION_TF_OWNER = "Maître : %s",
+ REG_COMPANION_TF_PROFILE = "Profil de compagnon",
+ REG_COMPANION_TF_PROFILE_MOUNT = "Profil de monture",
+ REG_COMPANION_TF_UNBOUND = "Délier le profil",
+ REG_COMPANION_TITLE = "Titre",
+ REG_COMPANION_UNBOUND = "Délier ...",
+ REG_DELETE_WARNING = [=[Êtes-vous sûr de vouloir supprimer le profil de %s?
+]=],
+ REG_IGNORE_TOAST = "Personnage ignoré",
+ REG_LIST_ACTIONS_MASS = "Action sur les %s profils sélectionnés",
+ REG_LIST_ACTIONS_MASS_IGNORE = "Ignorer les profils",
+ REG_LIST_ACTIONS_MASS_IGNORE_C = [=[Cette action ajoutera |cff00ff00%s personnage(s)|r à la liste des ignorés.
+
+Vous pouvez optionnellement entrer la raison ci-dessous. C'est une note personnelle, elle servira comme rappel.]=],
+ REG_LIST_ACTIONS_MASS_REMOVE = "Supprimer les profils",
+ REG_LIST_ACTIONS_MASS_REMOVE_C = "Cette action supprimera les |cff00ff00%s profils sélectionnés|r.",
+ REG_LIST_ACTIONS_PURGE = "Purger le registre",
+ REG_LIST_ACTIONS_PURGE_ALL = "Supprimer tous les profils",
+ REG_LIST_ACTIONS_PURGE_ALL_C = [=[Cette purge supprimera tous les profils et les personnages auxquels ils sont liés du registre.
+
+|cff00ff00%s personnages.]=],
+ REG_LIST_ACTIONS_PURGE_ALL_COMP_C = [=[Cette purge supprimera tous les compagnons du registre.
+
+|cff00ff00%s compagnons.]=],
+ REG_LIST_ACTIONS_PURGE_COUNT = "%s profils seront supprimés.",
+ REG_LIST_ACTIONS_PURGE_EMPTY = "Pas de profil à purger.",
+ REG_LIST_ACTIONS_PURGE_IGNORE = "Profils de personnages ignorés",
+ REG_LIST_ACTIONS_PURGE_IGNORE_C = [=[Cette purge supprimere tous les profils liés à un personnage WoW ignoré.
+
+|cff00ff00%s]=],
+ REG_LIST_ACTIONS_PURGE_TIME = "Profils non vus depuis 1 mois",
+ REG_LIST_ACTIONS_PURGE_TIME_C = [=[Cette purge supprimera tous les profils qui n'ont pas été vus depuis un mois.
+
+|cff00ff00%s]=],
+ REG_LIST_ACTIONS_PURGE_UNLINKED = "Profils non-liés à un personnage",
+ REG_LIST_ACTIONS_PURGE_UNLINKED_C = [=[Cette purge supprimera tous les profils qui ne sont pas liés à un personnage WoW.
+
+|cff00ff00%s]=],
+ REG_LIST_CHAR_EMPTY = "Aucun personnage",
+ REG_LIST_CHAR_EMPTY2 = "Aucun personnage ne correspond à votre sélection",
+ REG_LIST_CHAR_FILTER = "Personnages: %s / %s",
+ REG_LIST_CHAR_IGNORED = "Ignoré",
+ REG_LIST_CHAR_SEL = "Personnage sélectionné",
+ REG_LIST_CHAR_TITLE = "Liste de personnages",
+ REG_LIST_CHAR_TT = "Cliquer pour afficher la page",
+ REG_LIST_CHAR_TT_CHAR = "Personnage(s) WoW lié(s):",
+ REG_LIST_CHAR_TT_CHAR_NO = "Non lié à un personnage",
+ REG_LIST_CHAR_TT_DATE = [=[Vu pour la dernière fois le: |cff00ff00%s|r
+Vu pour la dernière fois à: |cff00ff00%s|r]=],
+ REG_LIST_CHAR_TT_GLANCE = "Coup d'œil",
+ REG_LIST_CHAR_TT_IGNORE = "Personnage(s) ignoré(s)",
+ REG_LIST_CHAR_TT_NEW_ABOUT = "Description non lue",
+ REG_LIST_CHAR_TT_RELATION = [=[Relation:
+|cff00ff00%s]=],
+ REG_LIST_CHAR_TUTO_ACTIONS = "Cette colonne vous permet de sélectionner plusieurs personnages afin d'effectuer une action sur tous les personnages sélectionnés.",
+ REG_LIST_CHAR_TUTO_FILTER = [=[Vous pouvez filtrer la liste de personnages.
+
+Le |cff00ff00filtre de nom|r permet de rechercher un personnage à partir du nom complet du profil (prénom + nom) mais aussi des personnages WoW liés.
+
+Le |cff00ff00filtre de guilde|r permet de rechercher à partir du nom de la guilde des personnages WoW liés.
+
+Le |cff00ff00filtre de royaume|r vous montrera uniquement les profils liés à un personnage WoW de votre royaume actuel.]=],
+ REG_LIST_CHAR_TUTO_LIST = [=[La première colonne affiche le nom du personnage.
+
+La deuxième colonne affiche la relation entre ces personnages et votre personnage actuel.
+
+La dernière colonne correspond aux différents marqueurs. (ignoré ..etc.)]=],
+ REG_LIST_FILTERS = "Filtres",
+ REG_LIST_FILTERS_TT = [=[|cffffff00Clic gauche:|r Appliquer les filtres
+|cffffff00Clic droit:|r Effacer les filtres]=],
+ REG_LIST_FLAGS = "Marqueurs",
+ REG_LIST_GUILD = "Guilde du personnage",
+ REG_LIST_IGNORE_EMPTY = "Pas de personnage ignoré",
+ REG_LIST_IGNORE_TITLE = "Liste des ignorés",
+ REG_LIST_IGNORE_TT = [=[Raison:
+|cff00ff00%s
+
+|cffffff00Cliquer pour supprimer de la ligne des ignorés]=],
+ REG_LIST_NAME = "Nom du personnage",
+ REG_LIST_NOTIF_ADD = "Nouveau profil découvert pour |cff00ff00%s",
+ REG_LIST_NOTIF_ADD_CONFIG = "Nouveau profil découvert",
+ REG_LIST_NOTIF_ADD_NOT = "Ce profil n'existe plus.",
+ REG_LIST_PET_MASTER = "Nom du maître",
+ REG_LIST_PET_NAME = "Nom du compagnon",
+ REG_LIST_PETS_EMPTY = "Aucun compagnon",
+ REG_LIST_PETS_EMPTY2 = "Aucun compagnon ne correspond à votre sélection",
+ REG_LIST_PETS_FILTER = "compagnons: %s / %s",
+ REG_LIST_PETS_TITLE = "Liste des compagnons",
+ REG_LIST_PETS_TOOLTIP = "A été vu le",
+ REG_LIST_PETS_TOOLTIP2 = "A été vu avec",
+ REG_LIST_PET_TYPE = "Type du compagnon",
+ REG_LIST_REALMONLY = "Ce royaume uniquement",
+ REG_MSP_ALERT = [=[|cffff0000ATTENTION
+
+Vous ne pouvez avoir simultanément plus d'un addon utilisant le Mary Sue Protocol, car cela créerait un conflit.|r
+
+Actuellement chargé: |cff00ff00%s
+
+|cffff9900En conséquence, le support MSP pour Total RP3 sera désactivé.|r
+
+Si vous ne souhaitez pas que TRP3 soit votre addon MSP et ne voulez plus voir cette alerte à nouveau, vous pouvez désactiver le module Mary Sue Protocol dans les paramètres TRP3 -> Statut des modules.]=],
+ REG_PLAYER = "Personnage",
+ REG_PLAYER_ABOUT = "À propos",
+ REG_PLAYER_ABOUT_ADD_FRAME = "Ajouter un cadre",
+ REG_PLAYER_ABOUT_EMPTY = "Aucune description",
+ REG_PLAYER_ABOUT_HEADER = "Tag de titre",
+ REG_PLAYER_ABOUT_MUSIC = "Thème du personnage",
+ REG_PLAYER_ABOUT_MUSIC_LISTEN = "Jouer le thème",
+ REG_PLAYER_ABOUT_MUSIC_REMOVE = "Désélectionner le thème",
+ REG_PLAYER_ABOUT_MUSIC_SELECT = "Choisir le thème du personnage",
+ REG_PLAYER_ABOUT_MUSIC_SELECT2 = "Choisir le thème",
+ REG_PLAYER_ABOUT_MUSIC_STOP = "Arrêter le thème",
+ REG_PLAYER_ABOUT_NOMUSIC = "|cffff9900Aucun thème",
+ REG_PLAYER_ABOUT_P = "Tag de paragraphe",
+ REG_PLAYER_ABOUT_REMOVE_FRAME = "Supprimer ce cadre",
+ REG_PLAYER_ABOUTS = "À propos de %s",
+ REG_PLAYER_ABOUT_SOME = "Du texte ...",
+ REG_PLAYER_ABOUT_T1_YOURTEXT = "Votre texte ici",
+ REG_PLAYER_ABOUT_TAGS = "Outils de mise en page",
+ REG_PLAYER_ABOUT_UNMUSIC = "|cffff9900Thème inconnu",
+ REG_PLAYER_ABOUT_VOTE_DOWN = "Je n'aime pas ce contenu",
+ REG_PLAYER_ABOUT_VOTE_NO = [=[Aucun personnage lié à ce profil ne semble être connecté.
+Voulez-vous forcer Total RP 3 à envoyer tout de même votre vote ?]=],
+ REG_PLAYER_ABOUT_VOTES = "Statistiques",
+ REG_PLAYER_ABOUT_VOTE_SENDING = "Envoi de votre vote à %s ...",
+ REG_PLAYER_ABOUT_VOTE_SENDING_OK = "Votre vote à été envoyé à %s !",
+ REG_PLAYER_ABOUT_VOTES_R = [=[|cff00ff00%s aiment ce contenu
+|cffff0000%s n'aiment pas ce contenu]=],
+ REG_PLAYER_ABOUT_VOTE_TT = "Votre vote est totalement anonyme et ne peut être vu que par ce joueur.",
+ REG_PLAYER_ABOUT_VOTE_TT2 = "Vous ne pouvez voter que si le joueur est connecté.",
+ REG_PLAYER_ABOUT_VOTE_UP = "J'aime ce contenu",
+ REG_PLAYER_ADD_NEW = "Créer nouveau",
+ REG_PLAYER_AGE = "Âge",
+ REG_PLAYER_AGE_TT = [=[Vous indiquez ici l'âge de votre personnage.
+
+Il y a plusieurs moyens de le faire:|c0000ff00
+- Utiliser un nombre d'années,
+- Ou un adjectif (Jeune, Mature, Adulte, Vénérable, etc.).]=],
+ REG_PLAYER_ALERT_HEAVY_SMALL = [=[|cffff0000La taille de votre profil est plutôt importante.
+|cffff9900Vous devriez la réduire.]=],
+ REG_PLAYER_BIRTHPLACE = "Lieu de naissance",
+ REG_PLAYER_BIRTHPLACE_TT = [=[Vous pouvez indiquer ici le lieu de naissance de votre personnage. Cela peut être une région, une zone, ou même un continent. C'est à vous de décider la précision avec laquelle vous souhaitez l'indiquer.
+
+|c00ffff00Vous pouvez utiliser le bouton à droite vous régler facilement votre position actuelle comme Lieu de naissance.]=],
+ REG_PLAYER_BKG = "Format d'arrière-plan",
+ REG_PLAYER_BKG_TT = "Cela représente l'arrière-plan graphique à utiliser pour votre panneau Caractéristiques",
+ REG_PLAYER_CARACT = "Caractéristiques",
+ REG_PLAYER_CHANGE_CONFIRM = [=[Il se peut que vous ayez effectué des changements non sauvegardés.
+Voulez-vous changer de page ?
+|cffff9900Tout changement non-sauvegardé sera perdu.]=],
+ REG_PLAYER_CHARACTERISTICS = "Caractéristiques",
+ REG_PLAYER_CLASS = "Classe",
+ REG_PLAYER_CLASS_TT = [=[Ceci est la classe personnalisée de votre personnage.
+
+|cff00ff00Par exemple :|r
+Chevalier, Pyrotechnicien, Nécromant, Tireur d'élite, Arcaniste ...]=],
+ REG_PLAYER_COLOR_CLASS = "Couleur de classe",
+ REG_PLAYER_COLOR_CLASS_TT = [=[Cela déterminera aussi la couleur de votre nom.
+
+]=],
+ REG_PLAYER_COLOR_TT = [=[|cffffff00Clic gauche:|r Sélectionner une couleur
+|cffffff00Clic droit:|r Effacer la couleur]=],
+ REG_PLAYER_CURRENT = "Actuellement",
+ REG_PLAYER_CURRENTOOC = "Actuellement (HRP)",
+ REG_PLAYER_CURRENT_OOC = "Ceci est une information hors du personnage",
+ REG_PLAYER_EYE = "Couleur des yeux",
+ REG_PLAYER_EYE_TT = [=[Vous pouvez indiquer ici la couleur des yeux de votre personnage.
+
+Pensez bien que, même si le visage de votre personnage est constamment caché, il peut être utile de le mentionner, au cas où.]=],
+ REG_PLAYER_FIRSTNAME = "Prénom",
+ REG_PLAYER_FIRSTNAME_TT = [=[C'est le prénom de votre personnage. Ce champ est obligatoire, donc si vous ne spécifiez aucun nom, le nom du personnage par défaut (|cffffff00%s|r) sera utilisé.
+
+Vous pouvez utiliser un |c0000ff00surnom |r!]=],
+ REG_PLAYER_FULLTITLE = "Titre complet",
+ REG_PLAYER_FULLTITLE_TT = [=[Vous pouvez indiquer ici le titre complet de votre personnage. Cela peut être une version plus longue du Titre ou un tout autre titre.
+
+Cependant, vous devriez éviter les répétitions, s'il n'y a aucune information supplémentaire à mentionner.]=],
+ REG_PLAYER_GLANCE = "Coup d'œil",
+ REG_PLAYER_GLANCE_BAR_DELETED = "Le groupe d'emplacements |cffff9900%s|r a été supprimé.",
+ REG_PLAYER_GLANCE_BAR_EMPTY = "Le nom du groupe ne peut pas être vide.",
+ REG_PLAYER_GLANCE_BAR_LOAD = "Groupe d'emplacements",
+ REG_PLAYER_GLANCE_BAR_LOAD_SAVE = "Groupe d'emplacements",
+ REG_PLAYER_GLANCE_BAR_NAME = [=[Merci d'entrer le nom du groupe.
+
+|cff00ff00Note: Si ce nom est déjà utilisé par un autre groupe, ce dernier sera remplacé.]=],
+ REG_PLAYER_GLANCE_BAR_SAVE = "Sauvegarder comme groupe",
+ REG_PLAYER_GLANCE_BAR_SAVED = "Le groupe d'emplacements |cff00ff00%s|r a été supprimé.",
+ REG_PLAYER_GLANCE_BAR_TARGET = "Groupe de \"Coup d’œil\"",
+ REG_PLAYER_GLANCE_CONFIG = [=[|cffffff00Clic gauche:|r Configurer l'emplacement
+|cffffff00Clic droit:|r Activer/Désactiver l'emplacement
+|cffffff00Glisser-déposer:|r Réorganiser les emplacements]=],
+ REG_PLAYER_GLANCE_EDITOR = "Coup d'œil : Emplacement %s",
+ REG_PLAYER_GLANCE_PRESET = "Charger depuis ...",
+ REG_PLAYER_GLANCE_PRESET_ALERT1 = "Veuillez entrer une catégorie et un nom",
+ REG_PLAYER_GLANCE_PRESET_ALERT2 = "Il y a déjà un coup d'œil appelée %s",
+ REG_PLAYER_GLANCE_PRESET_CATEGORY = "Catégorie",
+ REG_PLAYER_GLANCE_PRESET_NAME = "Coup d'œil",
+ REG_PLAYER_GLANCE_PRESET_NONE = "Effacer l'emplacement",
+ REG_PLAYER_GLANCE_PRESET_SAVE = "Enregistrer le coup d'œil sous ...",
+ REG_PLAYER_GLANCE_PRESET_SAVE_SMALL = "Enregistrer",
+ REG_PLAYER_GLANCE_PRESET_SELECT = "Choisir un coup d'œil",
+ REG_PLAYER_GLANCE_TITLE = "Nom de l'attribut",
+ REG_PLAYER_GLANCE_UNUSED = "Emplacement inutilisé",
+ REG_PLAYER_GLANCE_USE = "Activer cet emplacement",
+ REG_PLAYER_HEIGHT = "Taille",
+ REG_PLAYER_HEIGHT_TT = [=[Il s'agit de la taille de votre personnage.
+Il y a plusieurs manières de l'indiquer:|c0000ff00
+- Un nombre précis: 170 cm, 6'5" ...
+- Un qualificatif: Grand, petit ...]=],
+ REG_PLAYER_HERE = "Obtenir la position",
+ REG_PLAYER_HERE_TT = "Cliquer pour obtenir votre position actuelle",
+ REG_PLAYER_HISTORY = "Histoire",
+ REG_PLAYER_ICON = "Icône du personnage",
+ REG_PLAYER_ICON_TT = "Sélectionne une représentation graphique pour votre personnage.",
+ REG_PLAYER_IGNORE = "Ignorer les personnages liés (%s)",
+ REG_PLAYER_IGNORE_WARNING = [=[Voulez-vous ignorer ces personnages ?
+
+|cffff9900%s
+
+|rVous pouvez optionnellement entrer la raison de cette action. Cette note est personnelle et vous servira de rappel.]=],
+ REG_PLAYER_LASTNAME = "Nom",
+ REG_PLAYER_LASTNAME_TT = "C'est le nom de famille de votre personnage",
+ REG_PLAYER_LEFTTRAIT = "Attribut de gauche",
+ REG_PLAYER_MISC_ADD = "Ajouter un champ additionnel",
+ REG_PLAYER_MORE_INFO = "Informations additionnelles",
+ REG_PLAYER_MSP_HOUSE = "Maison",
+ REG_PLAYER_MSP_MOTTO = "Devise",
+ REG_PLAYER_MSP_NICK = "Surnom",
+ REG_PLAYER_NAMESTITLES = "Noms et titres",
+ REG_PLAYER_NO_CHAR = "Pas de caractéristiques",
+ REG_PLAYER_PEEK = "Divers",
+ REG_PLAYER_PHYSICAL = "Physique",
+ REG_PLAYER_PSYCHO = "Personnalité",
+ REG_PLAYER_PSYCHO_Acete = "Ascète",
+ REG_PLAYER_PSYCHO_ADD = "Ajouter un trait de personnalité",
+ REG_PLAYER_PSYCHO_ATTIBUTENAME_TT = "Nom de l'attribut",
+ REG_PLAYER_PSYCHO_Bonvivant = "Bon vivant",
+ REG_PLAYER_PSYCHO_CHAOTIC = "Chaotique",
+ REG_PLAYER_PSYCHO_Chaste = "Chaste",
+ REG_PLAYER_PSYCHO_Conciliant = "Parangon",
+ REG_PLAYER_PSYCHO_Couard = "Couard",
+ REG_PLAYER_PSYCHO_CREATENEW = "Créer un trait",
+ REG_PLAYER_PSYCHO_Cruel = "Brutal",
+ REG_PLAYER_PSYCHO_CUSTOM = "Trait personnalisé",
+ REG_PLAYER_PSYCHO_Egoiste = "Egoïste",
+ REG_PLAYER_PSYCHO_Genereux = "Altruiste",
+ REG_PLAYER_PSYCHO_Impulsif = "Impulsif",
+ REG_PLAYER_PSYCHO_Indulgent = "Indulgent",
+ REG_PLAYER_PSYCHO_LEFTICON_TT = "Régler l'icône d'attribut de gauche",
+ REG_PLAYER_PSYCHO_Loyal = "Loyal",
+ REG_PLAYER_PSYCHO_Luxurieux = "Luxurieux",
+ REG_PLAYER_PSYCHO_Misericordieux = "Miséricordieux",
+ REG_PLAYER_PSYCHO_MORE = "Ajouter un point à \"%s\"",
+ REG_PLAYER_PSYCHO_PERSONAL = "Traits personnels",
+ REG_PLAYER_PSYCHO_Pieux = "Pieux",
+ REG_PLAYER_PSYCHO_POINT = "Ajouter un point",
+ REG_PLAYER_PSYCHO_Pragmatique = "Pragmatique",
+ REG_PLAYER_PSYCHO_Rationnel = "Rationnel",
+ REG_PLAYER_PSYCHO_Reflechi = "Réflechi",
+ REG_PLAYER_PSYCHO_Rencunier = "Rancunier",
+ REG_PLAYER_PSYCHO_RIGHTICON_TT = "Régler l'icône de l'attribut de droite.",
+ REG_PLAYER_PSYCHO_Sincere = "Sincère",
+ REG_PLAYER_PSYCHO_SOCIAL = "Traits sociaux",
+ REG_PLAYER_PSYCHO_Trompeur = "Trompeur",
+ REG_PLAYER_PSYCHO_Valeureux = "Valeureux",
+ REG_PLAYER_RACE = "Race",
+ REG_PLAYER_RACE_TT = "Il s'agit de la race de votre personnage. Il n'est pas nécessaire de se restreindre aux races jouables. Il y a de nombreuses races de Warcraft qui peuvent posséder des formes communes ...",
+ REG_PLAYER_REGISTER = "Informations du registre",
+ REG_PLAYER_RESIDENCE = "Lieu de résidence",
+ REG_PLAYER_RESIDENCE_TT = [=[Vous pouvez indiquer ici où votre personnage vit en temps normal. Il peut s'agir de son adresse personnelle (sa maison) ou un endroit où il séjourne.
+Notez que si votre personnage est un voyageur ou encore un sans-domicile, vous devrez changer l'information en accord avec cela.
+
+|c00ffff00Vous pouvez utiliser le bouton à droite pour définir facilement votre position actuelle comme Lieu de résidence.]=],
+ REG_PLAYER_RIGHTTRAIT = "Attribut de droite",
+ REG_PLAYER_SHOWMISC = "Afficher le panneau \"Divers\"",
+ REG_PLAYER_SHOWMISC_TT = [=[Cochez si vous désirez afficher des champs personnalisés pour votre personnage.
+
+Si vous ne désirez pas afficher de champs personnalisés, laissez ce bouton décoché et le panneau "Divers" restera complètement caché.]=],
+ REG_PLAYER_SHOWPSYCHO = "Afficher le panneau de personnalité",
+ REG_PLAYER_SHOWPSYCHO_TT = [=[Cochez si vous désirez utiliser la description de personnalité.
+
+Si vous ne voulez pas indiquer la personnalité de votre personnage ainsi, laissez ce bouton décoché et le panneau de personnalité restera complètement caché.]=],
+ REG_PLAYER_STYLE_ASSIST = "Aide au jeu de rôle",
+ REG_PLAYER_STYLE_BATTLE = "Résolution de combats RP",
+ REG_PLAYER_STYLE_BATTLE_1 = "JcJ World of Warcraft",
+ REG_PLAYER_STYLE_BATTLE_2 = "Bataille de jets de dés TRP (Indisponible pour le moment)",
+ REG_PLAYER_STYLE_BATTLE_3 = "Bataille de /rand",
+ REG_PLAYER_STYLE_BATTLE_4 = "Bataille d'émotes",
+ REG_PLAYER_STYLE_DEATH = "Accepte la mort",
+ REG_PLAYER_STYLE_EMPTY = "Pas d'attribut de jeu de rôle partagé",
+ REG_PLAYER_STYLE_FREQ = "Fréquence de jeu en RP",
+ REG_PLAYER_STYLE_FREQ_1 = "Plein temps",
+ REG_PLAYER_STYLE_FREQ_2 = "La plupart du temps",
+ REG_PLAYER_STYLE_FREQ_3 = "La moitié du temps",
+ REG_PLAYER_STYLE_FREQ_4 = "De temps en temps",
+ REG_PLAYER_STYLE_FREQ_5 = "Pas un personnage RP",
+ REG_PLAYER_STYLE_GUILD = "Appartenance à la guilde",
+ REG_PLAYER_STYLE_GUILD_IC = "Membre RP",
+ REG_PLAYER_STYLE_GUILD_OOC = "Membre HRP",
+ REG_PLAYER_STYLE_HIDE = "Ne pas afficher",
+ REG_PLAYER_STYLE_INJURY = "Accepte les blessures",
+ REG_PLAYER_STYLE_PERMI = "Avec permission du joueur",
+ REG_PLAYER_STYLE_ROMANCE = "Accepte la romance",
+ REG_PLAYER_STYLE_RPSTYLE = "Style de roleplay",
+ REG_PLAYER_STYLE_RPSTYLE_SHORT = "Style de RP",
+ REG_PLAYER_STYLE_WOWXP = "Expérience de World of Warcraft",
+ REG_PLAYER_TITLE = "Titre",
+ REG_PLAYER_TITLE_TT = [=[Le titre de votre personnage est le titre par lequel votre personnage est habituellement appelé. Evitez les titres longs, l'attribut de Titre complet y est consacré.
+
+Exemple de |c0000ff00titres appropriés |r:
+|c0000ff00- Comtesse,
+- Marquis,
+- Magus,
+- Seigneur,
+- etc.
+|rExemple of |cffff0000titres inappropriés|r:
+|cffff0000- Comtesse des Marches du Nord,
+- Magus de la Tour de Hurlevent,
+- Diplomate pour le Gouvernement Draenei,
+- etc.]=],
+ REG_PLAYER_TRP2_PIERCING = "Piercings",
+ REG_PLAYER_TRP2_TATTOO = "Tatouages",
+ REG_PLAYER_TRP2_TRAITS = "Traits du visage",
+ REG_PLAYER_TUTO_ABOUT_COMMON = [=[|cff00ff00Thème de personnage:|r
+Vous pouvez choisir un |cffffff00thème|r pour votre personnage. Pensez-y comme une |cffffff00musique d'ambiance pour lire la description de votre personnage|r.
+
+|cff00ff00Arrière-plan:|r
+Ceci est une |cffffff00texture d'arrière-plan|r pour la description de votre personnage.
+
+|cff00ff00Modèle:|r
+Le modèle choisi définit |cffffff00le format général et les possibilités d'écriture|r de votre description.
+|cffff9900Seul le modèle sélectionné est visible par les autres, vous n'avez donc pas à tous les remplir.|r
+Une fois qu'un modèle est choisi, vous pouvez rouvrir ce tutoriel pour avoir plus d'aide à propos de chaque modèle.]=],
+ REG_PLAYER_TUTO_ABOUT_MISC_1 = [=[Cette section vous fournit des |cffffff005 emplacements|r dans lesquels vous pouvez décrire |cff00ff00les informations les plus importantes à propos de votre personnage|r.
+
+Ces informations seront visibles sur la |cffffff00barre "Coup d'œil"|r lorsque quelqu'un sélectionne votre personnage.
+
+|cff00ff00Astuce: Vous pouvez glisser et déposer les emplacements pour les réorganiser.|r
+Cela marche aussi sur la |cffffff00barre "Coup d'œil"|r!]=],
+ REG_PLAYER_TUTO_ABOUT_MISC_3 = "Cette section fournit |cffffff00une liste d'indicateurs|r pour répondre à beaucoup de |cffffff00questions usuelles que les joueurs peuvent vous demander à propos de vous, votre personnage, et la manière dont vous souhaitez le jouer|r.",
+ REG_PLAYER_TUTO_ABOUT_T1 = [=[Ce modèle vous permet de |cff00ff00structurer librement votre description|r.
+
+La description n'a pas besoin d'être limitée uniquement à la |cffff9900description physique|r de votre personnage. N'hésitez pas à indiquer des parties de son |cffff9900histoire|r ou des détails sur sa |cffff9900personnalité|r.
+
+Avec ce modèle vous pouvez aussi utiliser les outils de formatage pour accéder à plusieurs paramètres de mise en page tels que |cffffff00les tailles de texte, les couleurs, ou les alignements|r.
+Ces outils vous permettent aussi d'insérer |cffffff00des images, des icônes ou des liens vers des sites web externes|r.]=],
+ REG_PLAYER_TUTO_ABOUT_T2 = [=[Ce modèle est plus structuré et consiste en |cff00ff00une liste de cadres indépendants|r.
+
+Chaque cadre est caractérisé par une |cffffff00icône, un arrière-plan et un texte|r. Notez que vous pouvez utiliser quelques balises de texte dans ces cadres, comme celles de couleur, ou d'icônes.
+
+La description n'a pas besoin d'être limitée uniquement à la |cffff9900description physique|r de votre personnage. N'hésitez pas à indiquer des parties de son |cffff9900histoire|r ou des détails sur sa |cffff9900personnalité|r.]=],
+ REG_PLAYER_TUTO_ABOUT_T3 = [=[Ce modèle est découpé en 3 sections: |cff00ff00Description physique, personnalité et histoire|r.
+
+Vous n'avez pas à remplir tous les cadres, |cffff9900Si vous laissez un cadre vide, il ne sera pas affiché sur votre description|r.
+
+Chaque cadre est caractérisé par une |cffffff00icône, un arrière-plan et un texte|r. Notez que vous pouvez utiliser quelques balises de texte dans ces cadres, comme celles de couleur, ou d'icônes.]=],
+ REG_PLAYER_WEIGHT = "Stature",
+ REG_PLAYER_WEIGHT_TT = [=[Il s'agit de la stature de votre personnage.
+Il pourrait par exemple être |c0000ff00mince, gros ou musclé...|r Ou tout simplement être dans la norme !]=],
+ REG_REGISTER = "Registre",
+ REG_REGISTER_CHAR_LIST = "Liste de personnages",
+ REG_RELATION = "Relation",
+ REG_RELATION_BUSINESS = "Commerce",
+ REG_RELATION_BUSINESS_TT = "%s et %s sont dans une relation d'affaires.",
+ REG_RELATION_BUTTON_TT = [=[Relation: %s
+|cff00ff00%s
+
+|cffffff00Cliquer pour afficher les actions possibles]=],
+ REG_RELATION_FAMILY = "Famille",
+ REG_RELATION_FAMILY_TT = "%s partage des liens du sang avec %s.",
+ REG_RELATION_FRIEND = "Amical",
+ REG_RELATION_FRIEND_TT = "%s considère %s comme un ami.",
+ REG_RELATION_LOVE = "Amour",
+ REG_RELATION_LOVE_TT = "%s est amoureux de %s !",
+ REG_RELATION_NEUTRAL = "Neutre",
+ REG_RELATION_NEUTRAL_TT = "%s n'a pas d'affection particulière pour %s.",
+ REG_RELATION_NONE = "Aucune",
+ REG_RELATION_NONE_TT = "%s ne connaît pas %s.",
+ REG_RELATION_TARGET = "|cffffff00Clic gauche: |rChanger la relation",
+ REG_RELATION_UNFRIENDLY = "Hostile",
+ REG_RELATION_UNFRIENDLY_TT = "%s n'aime vraiment pas %s.",
+ REG_TT_GUILD = "%s de |cffff9900%s",
+ REG_TT_GUILD_IC = "membre RP",
+ REG_TT_GUILD_OOC = "membre HRP",
+ REG_TT_IGNORED = "< Le personnage est ignoré >",
+ REG_TT_IGNORED_OWNER = "< Le propriétaire est ignoré >",
+ REG_TT_LEVEL = "Niveau %s %s",
+ REG_TT_NOTIF = "Description non-lue",
+ REG_TT_REALM = "Royaume: |cffff9900%s",
+ REG_TT_TARGET = "Cible: |cffff9900%s",
+ TB_AFK_MODE = "Absent",
+ TB_DND_MODE = "Ne pas déranger",
+ TB_GO_TO_MODE = "Passer en mode %s",
+ TB_NORMAL_MODE = "Normal",
+ TB_RPSTATUS_OFF = "Personnage: |cffff0000Hors du personnage",
+ TB_RPSTATUS_ON = "Personnage: |cff00ff00Dans le personnage",
+ TB_RPSTATUS_TO_OFF = "Passer |cffff0000hors du personnage",
+ TB_RPSTATUS_TO_ON = "Passer |cff00ff00dans le personnage",
+ TB_STATUS = "Joueur",
+ TB_SWITCH_CAPE_1 = "Afficher la cape",
+ TB_SWITCH_CAPE_2 = "Masquer la cape",
+ TB_SWITCH_CAPE_OFF = "Cape: |cffff0000Masquée",
+ TB_SWITCH_CAPE_ON = "Cape: |cffff0000Affichée",
+ TB_SWITCH_HELM_1 = "Afficher le casque",
+ TB_SWITCH_HELM_2 = "Masquer le casque",
+ TB_SWITCH_HELM_OFF = "Casque: |cffff0000Masqué",
+ TB_SWITCH_HELM_ON = "Casque: |cffff0000Affiché",
+ TB_SWITCH_PROFILE = "Passer à un autre profil",
+ TB_SWITCH_TOOLBAR = "Afficher/masquer la barre d'outils",
+ TB_TOOLBAR = "Barre d'outils",
+ TF_IGNORE = "Ignorer le joueur",
+ TF_IGNORE_CONFIRM = [=[Êtes-vous sûr de vouloir ignorer ce joueur ?
+
+|cffffff00%s|r
+
+|cffff7700Vous pouvez entrer optionnellement la raison d'ignorer le joueur ci-dessous. C'est une note personnelle, elle ne sera vue par personne d'autre et servira de rappel.]=],
+ TF_IGNORE_NO_REASON = "Aucune raison",
+ TF_IGNORE_TT = "|cffffff00Clic gauche:|r Ignorer le joueur",
+ TF_OPEN_CHARACTER = "Afficher la fiche du personnage",
+ TF_OPEN_COMPANION = "Afficher la fiche du familier",
+ TF_OPEN_MOUNT = "Afficher la fiche de la monture",
+ TF_PLAY_THEME = "Jouer le thème du personnage",
+ TF_PLAY_THEME_TT = [=[|cffffff00Clic gauche:|r Jouer |cff00ff00%s
+|cffffff00Clic droit:|r Arrêter le thème]=],
+ UI_BKG = "Arrière-plan %s",
+ UI_CLOSE_ALL = "Fermer tout",
+ UI_COLOR_BROWSER = "Sélecteur de couleur",
+ UI_COLOR_BROWSER_SELECT = "Choisir une couleur",
+ UI_COMPANION_BROWSER_HELP = "Sélectionner une mascotte",
+ UI_COMPANION_BROWSER_HELP_TT = [=[|cffffff00Attention: |rSeules les mascottes renommées peuvent être associées à un profil.
+
+|cff00ff00Cette section ne liste que ces mascottes.]=],
+ UI_FILTER = "Filtre",
+ UI_ICON_BROWSER = "Navigateur d'icônes",
+ UI_ICON_BROWSER_HELP = "Copier l'icône",
+ UI_ICON_BROWSER_HELP_TT = [=[Tant que cette fenêtre est ouverte, vous pouvez |cffffff00CTRL + cliquer|r sur une icône pour copier son nom.
+
+Disponible pour:|cff00ff00
+- Un objet de votre sac
+- Un sort du grimoire|r]=],
+ UI_ICON_SELECT = "Choisir une icône",
+ UI_IMAGE_BROWSER = "Navigateur d'images",
+ UI_IMAGE_SELECT = "Choisir une image",
+ UI_LINK_TEXT = "Votre texte ici",
+ UI_LINK_URL = "http://votre.url.ici",
+ UI_LINK_WARNING = [=[Voici l'URL du lien.
+Vous pouvez le copier-coller dans votre navigateur web.
+
+|cffff0000!! Attention !!|r
+Total RP n'est pas responsable du contenu des liens partagés.]=],
+ UI_MUSIC_BROWSER = "Navigateur de musiques",
+ UI_MUSIC_SELECT = "Choisir une musique",
+ UI_TUTO_BUTTON = "Mode tutoriel",
+ UI_TUTO_BUTTON_TT = "Cliquer pour afficher ou masquer le mode tutoriel",
+ }
+};
+
+TRP3_API.locale.registerLocale(LOCALE);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale_ruRU.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale_ruRU.lua
new file mode 100644
index 000000000..3169e22be
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale_ruRU.lua
@@ -0,0 +1,355 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Russian locale
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local LOCALE = {
+ locale = "ruRU",
+ localeText = "Russian",
+ localeContent = {
+ ABOUT_TITLE = [=[О персонаже
+]=],
+ BINDING_NAME_TRP3_TOGGLE = "Показать/спрятать главное окно",
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = "Показать/спрятать панель инструментов",
+ BW_COLOR_CODE = "Код цвета",
+ BW_COLOR_CODE_ALERT = "Некорректный 16-тиричный код!", -- Needs review
+ BW_COLOR_CODE_TT = "Здесь можно вставить 6 цифр 16-тиричного цветового кода и нажать Enter.", -- Needs review
+ CM_ACTIONS = "Опции",
+ CM_APPLY = "Применить",
+ CM_CANCEL = "Отмена",
+ CM_CENTER = "Центр",
+ CM_CLASS_DEATHKNIGHT = "Рыцарь Смерти",
+ CM_CLASS_DRUID = "Друид",
+ CM_CLASS_HUNTER = "Охотник",
+ CM_CLASS_MAGE = "Маг",
+ CM_CLASS_MONK = "Монах",
+ CM_CLASS_PALADIN = "Паладин",
+ CM_CLASS_PRIEST = "Жрец",
+ CM_CLASS_ROGUE = "Разбойник",
+ CM_CLASS_SHAMAN = "Шаман",
+ CM_CLASS_UNKNOWN = "Неизвестно",
+ CM_CLASS_WARLOCK = "Чернокнижник",
+ CM_CLASS_WARRIOR = "Воин",
+ CM_CLICK = "Щелчок", -- Needs review
+ CM_COLOR = "Цвет",
+ CM_CTRL = "Ctrl",
+ CM_DRAGDROP = "Перетащить",
+ CM_EDIT = "Редактировать",
+ CM_IC = "В роли",
+ CM_ICON = "Иконка",
+ CM_IMAGE = "Изображение",
+ CM_L_CLICK = "ЛКМ",
+ CM_LEFT = "Влево", -- Needs review
+ CM_LINK = "Ссылка",
+ CM_LOAD = "Загрузить",
+ CM_MOVE_DOWN = "Сдвинуть вниз", -- Needs review
+ CM_MOVE_UP = "Сдвинуть вверх", -- Needs review
+ CM_NAME = "Имя",
+ CM_OOC = "Вне роли",
+ CM_OPEN = "Открыть",
+ CM_PLAY = "Играть", -- Needs review
+ CM_R_CLICK = "ПКМ",
+ CM_REMOVE = "Убрать",
+ CM_RIGHT = "Вправо", -- Needs review
+ CM_SAVE = "Сохранить", -- Needs review
+ CM_SELECT = "Выбрать", -- Needs review
+ CM_SHIFT = "Shift", -- Needs review
+ CM_SHOW = "Показать", -- Needs review
+ CM_STOP = "Стоп", -- Needs review
+ CM_UNKNOWN = "Неизвестно", -- Needs review
+ CM_VALUE = "Значение", -- Needs review
+ CO_ANCHOR_BOTTOM = "Внизу", -- Needs review
+ CO_ANCHOR_BOTTOM_LEFT = "Внизу слева", -- Needs review
+ CO_ANCHOR_BOTTOM_RIGHT = "Внизу справа", -- Needs review
+ CO_ANCHOR_LEFT = "Слева", -- Needs review
+ CO_ANCHOR_RIGHT = "Справа", -- Needs review
+ CO_ANCHOR_TOP = "Вверху", -- Needs review
+ CO_ANCHOR_TOP_LEFT = "Слева вверху", -- Needs review
+ CO_ANCHOR_TOP_RIGHT = "Справа вверху", -- Needs review
+ CO_CHAT = "Настройки чата", -- Needs review
+ CO_CHAT_MAIN = "Основные настройки чата", -- Needs review
+ CO_CHAT_MAIN_COLOR = "Использовать особые цвета имен", -- Needs review
+ CO_CHAT_MAIN_EMOTE = "Обнаружение эмоций", -- Needs review
+ CO_CHAT_MAIN_EMOTE_PATTERN = "Шаблон обнаружения эмоций", -- Needs review
+ CO_CHAT_MAIN_EMOTE_USE = "Использовать обнаружение эмоций", -- Needs review
+ CO_CHAT_MAIN_EMOTE_YELL = "Не /кричатьэмоции", -- Needs review
+ CO_CHAT_MAIN_EMOTE_YELL_TT = "Не показывать *эмоция* или <эмоция> в канале /крик", -- Needs review
+ CO_CHAT_MAIN_NAMING = "Метод именования", -- Needs review
+ CO_CHAT_MAIN_NAMING_1 = "Оставить первоначальные имена", -- Needs review
+ CO_CHAT_MAIN_NAMING_2 = "Использовать свои имена", -- Needs review
+ CO_CHAT_MAIN_NAMING_3 = "Имя + Фамилия", -- Needs review
+ CO_CHAT_MAIN_NPC = "Обнаружение разговоров НИПов", -- Needs review
+ CO_CHAT_MAIN_NPC_PREFIX = "Шаблон обнаружения разговоров НИПов", -- Needs review
+ CO_CHAT_MAIN_NPC_PREFIX_TT = [=[Если фраза в чате с этим префиксом будет сказана в каналах /сказать, /эмоция, /группа или /рейд, она будет распознана как фраза НИПа.
+
+|cff00ff00By default : "|| "
+(без кавычек" и с пробелом после разделительной линии)]=], -- Needs review
+ CO_CHAT_MAIN_NPC_USE = "Использовать обнаружение разговора НИПов.", -- Needs review
+ CO_CHAT_MAIN_OOC = "Обнаружение персонажей вне отыгрыша", -- Needs review
+ CO_CHAT_MAIN_OOC_COLOR = "Цвет \"вне отыгрыша\"", -- Needs review
+ CO_CHAT_MAIN_OOC_PATTERN = "Шаблон обнаружения \"вне отыгрыша\"", -- Needs review
+ CO_CHAT_MAIN_OOC_USE = "Использовать обнаружение \"вне отыгрыша\"", -- Needs review
+ CO_CHAT_USE = "Используемые каналы чата", -- Needs review
+ CO_CHAT_USE_SAY = "Канал /сказать", -- Needs review
+ CO_CONFIGURATION = "Настройки", -- Needs review
+ CO_GENERAL = "Основные настройки", -- Needs review
+ CO_GENERAL_BROADCAST = "Использовать общий канал чата", -- Needs review
+ CO_GENERAL_BROADCAST_C = "Название общего канала чата", -- Needs review
+ CO_GENERAL_BROADCAST_TT = "Общий канал чата нужен для многих вещей. Отключив его, вы отключите такие опции как нахождение на карте, локальные звуки, тайники и доступ к указателям...", -- Needs review
+ CO_GENERAL_CHANGELOCALE_ALERT = [=[Пегрегрузите интерфейс, чтобы изменить язык на %s прямо сейчас.
+
+Или язык будет изменен при следующем входе в игру.]=], -- Needs review
+ CO_GENERAL_COM = "Общение", -- Needs review
+ CO_GENERAL_HEAVY = "Предупреждение о перегруженном профиле", -- Needs review
+ CO_GENERAL_HEAVY_TT = "Оповестить, когда общий размер вашего профиля превысит разумное значение", -- Needs review
+ CO_GENERAL_LOCALE = "Язык аддона", -- Needs review
+ CO_GENERAL_MISC = "Разное", -- Needs review
+ CO_GENERAL_NEW_VERSION = "Оповещение об обновлениях", -- Needs review
+ CO_GENERAL_NEW_VERSION_TT = "Оповестить, когда будет доступна новая версия аддона.", -- Needs review
+ CO_GENERAL_NOTIF = "Уведомления", -- Needs review
+ CO_GENERAL_TT_SIZE = "Размер текста подсказок", -- Needs review
+ CO_GENERAL_UI_ANIMATIONS = "Анимация интерфейса", -- Needs review
+ CO_GENERAL_UI_ANIMATIONS_TT = "Включить анимацию интерфейса.", -- Needs review
+ CO_GENERAL_UI_SOUNDS = "Звуки интерфейса", -- Needs review
+ CO_GENERAL_UI_SOUNDS_TT = "Включить звуки интерфейса (при открытии окон, переключении вкладок, нажатии кнопок).", -- Needs review
+ CO_GLANCE_LOCK = "Закрепить панель", -- Needs review
+ CO_GLANCE_LOCK_TT = "Запрещает перетаскивание панели", -- Needs review
+ CO_GLANCE_MAIN = "Панель \"На первый взгляд\"", -- Needs review
+ CO_GLANCE_PRESET_TRP2 = "Использовать позиционирование в стиле Total RP 2", -- Needs review
+ CO_GLANCE_PRESET_TRP2_BUTTON = "Использовать", -- Needs review
+ CO_GLANCE_PRESET_TRP2_HELP = "Ярлык для установки панели в стиле TRP2: справа от рамки цели WoW.", -- Needs review
+ CO_GLANCE_PRESET_TRP3 = "Использовать позиционирование в стиле Total RP 3", -- Needs review
+ CO_GLANCE_PRESET_TRP3_HELP = "Ярлык для установки панели в стиле TRP3: снизу от рамки цели TRP3.", -- Needs review
+ CO_GLANCE_RESET_TT = "Сбросить позиционирование панели вниз влево от закрепленной рамки.", -- Needs review
+ CO_GLANCE_TT_ANCHOR = "Точка закрепления подсказок", -- Needs review
+ CO_MINIMAP_BUTTON = "Кнопка у миникарты", -- Needs review
+ CO_MINIMAP_BUTTON_FRAME = "Рамка для закрепления", -- Needs review
+ CO_MINIMAP_BUTTON_RESET = "Сбросить позицию", -- Needs review
+ CO_MINIMAP_BUTTON_RESET_BUTTON = "Сбросить", -- Needs review
+ COM_LIST = "Список команд", -- Needs review
+ CO_MODULES = "Статус модулей", -- Needs review
+ CO_MODULES_DISABLE = "Отключить модуль", -- Needs review
+ CO_MODULES_ENABLE = "Включить модуль", -- Needs review
+ CO_MODULES_ID = "ID модуля: %s", -- Needs review
+ CO_MODULES_SHOWERROR = "Показать ошибку", -- Needs review
+ CO_MODULES_STATUS = "Статус: %s", -- Needs review
+ CO_MODULES_STATUS_0 = "Недостающие зависимости", -- Needs review
+ CO_MODULES_STATUS_1 = "Загружен", -- Needs review
+ CO_MODULES_STATUS_2 = "Отключен", -- Needs review
+ CO_MODULES_STATUS_3 = "Total RP 3 требуется обновление", -- Needs review
+ CO_MODULES_STATUS_4 = "Ошибка инициализации", -- Needs review
+ CO_MODULES_STATUS_5 = "Ошибка запуска", -- Needs review
+ CO_MODULES_TT_DEP = [=[
+%s- %s (версия %s)|r]=], -- Needs review
+ CO_MODULES_TT_DEPS = "Зависимости", -- Needs review
+ CO_MODULES_TT_ERROR = [=[
+
+|cffff0000Ошибка:|r
+%s]=], -- Needs review
+ CO_MODULES_TT_NONE = "Нет зависимостей", -- Needs review
+ CO_MODULES_TT_TRP = "%sДля Total RP 3 версии %s и выше.|r", -- Needs review
+ CO_MODULES_TUTO = [=[Модуль — независимая опция, которую можно включить или отключить.
+
+Возможные статусы:
+|cff00ff00Загружен:|r Модуль включен и загружен.
+|cff999999Отключен:|r Модуль отключен.
+|cffff9900Недостающие зависимости:|r Некоторые зависимости не загружены.
+|cffff9900TRP требуется обновление:|r Модулю требуется последняя версия TRP3.
+|cffff0000Ошибка инициализации или запуска:|r Порядок загрузки модуля нарушен. Модуль будет создавать ошибки!
+
+|cffff9900При отключении модуля необходимо перегрузить интерфейс.]=], -- Needs review
+ CO_MODULES_VERSION = "Версия: %s", -- Needs review
+ COM_RESET_RESET = "Расположение окон сброшено!", -- Needs review
+ COM_RESET_USAGE = "Использование: |cff00ff00/trp3 сброс фреймов|r сбросить расположение окон.", -- Needs review
+ CO_MSP = "Мэри Сью Протокол", -- Needs review
+ CO_MSP_T3 = "Использовать только шаблон 3", -- Needs review
+ CO_MSP_T3_TT = "Шаблон 3 всегда будет использоваться для совместимости с МСП, даже если вы выберите другой шаблон \"Описание\".", -- Needs review
+ COM_SWITCH_USAGE = "Использование: |cff00ff00/trp3 вкл/выкл главное окно|r чтобы показать/скрыть главное окно или |cff00ff00/trp3 вкл/выкл панель инструментов|r чтобы показать/скрыть панель инструментов", -- Needs review
+ CO_NOTIF_DOUBLE = "Уведомление + сообщение в чате", -- Needs review
+ CO_NOTIF_NO = "Без уведомления", -- Needs review
+ CO_NOTIF_SIMPLE = "Уведомление", -- Needs review
+ CO_NOTIF_TRIPLE = "Уведомление + сообщение в чате + рейд-оповещение", -- Needs review
+ CO_REGISTER = "Настройки реестра", -- Needs review
+ CO_REGISTER_ABOUT_VOTE = "Использовать систему голосования", -- Needs review
+ CO_REGISTER_ABOUT_VOTE_TT = "Включает систему голосования, позволяя голосовать (\"нравится\" или \"не нравится\") за описания других игроков и позволяя им делать то же самое для вас.", -- Needs review
+ CO_REGISTER_AUTO_ADD = "Автоматически добавлять новых игроков", -- Needs review
+ CO_REGISTER_AUTO_ADD_TT = "Автоматически добавлять новых игроков из реестра.", -- Needs review
+ CO_TARGETFRAME = "Настройки рамки цели", -- Needs review
+ CO_TARGETFRAME_ICON_SIZE = "Размер иконок", -- Needs review
+ CO_TARGETFRAME_USE = "Показать условия", -- Needs review
+ CO_TARGETFRAME_USE_1 = "Всегда", -- Needs review
+ CO_TARGETFRAME_USE_2 = "Только когда \"отыгрываю\"", -- Needs review
+ CO_TARGETFRAME_USE_3 = "Никогда (Отключено)", -- Needs review
+ CO_TARGETFRAME_USE_TT = "Определяет при каких условиях будет показана рамка цели при выборе цели.", -- Needs review
+ CO_TOOLBAR = "Настройки рамок", -- Needs review
+ CO_TOOLBAR_CONTENT = "Настройки панели инструментов", -- Needs review
+ CO_TOOLBAR_CONTENT_CAPE = "Смена отображения плаща", -- Needs review
+ CO_TOOLBAR_CONTENT_HELMET = "Смена отображения шлема", -- Needs review
+ CO_TOOLBAR_CONTENT_RPSTATUS = "Статус персонажа (Отыгрываю/Не отыгрываю)", -- Needs review
+ CO_TOOLBAR_CONTENT_STATUS = "Статус игрока (Отсутствует/Не беспокоить)", -- Needs review
+ CO_TOOLBAR_ICON_SIZE = "Размер иконок", -- Needs review
+ CO_TOOLBAR_MAX = "Максимум иконок в строке", -- Needs review
+ CO_TOOLBAR_MAX_TT = "Чтобы панель отображалась вертикально, задайте значение 1!", -- Needs review
+ CO_TOOLTIP = "Настройки подсказок", -- Needs review
+ CO_TOOLTIP_ANCHOR = "Точка закрепления", -- Needs review
+ CO_TOOLTIP_ANCHORED = "Закрепленная рамка", -- Needs review
+ CO_TOOLTIP_CHARACTER = "Подсказки персонажей", -- Needs review
+ CO_TOOLTIP_CLIENT = "Показать клиент", -- Needs review
+ CO_TOOLTIP_COMBAT = "Прятать в бою", -- Needs review
+ CO_TOOLTIP_COMMON = "Общие настройки", -- Needs review
+ CO_TOOLTIP_CURRENT = "Показывать текст \"текущее\"", -- Needs review
+ CO_TOOLTIP_CURRENT_SIZE = "Максимальная длина текста \"текущее\"", -- Needs review
+ CO_TOOLTIP_FT = "Показывать полный титул", -- Needs review
+ CO_TOOLTIP_GUILD = "Показывать информацию о гильдии", -- Needs review
+ CO_TOOLTIP_HIDE_ORIGINAL = "Скрывать подсказки игры", -- Needs review
+ CO_TOOLTIP_ICONS = "Показывать иконки", -- Needs review
+ CO_TOOLTIP_MAINSIZE = "Размер основного шрифта", -- Needs review
+ CO_TOOLTIP_NOTIF = "Показывать уведомления", -- Needs review
+ CO_TOOLTIP_NOTIF_TT = "Строка уведомлений — строка, содержащая версию клиента, метку непрочитанного описания и метку \"На первый взгляд\".", -- Needs review
+ CO_TOOLTIP_OWNER = "Показать владельца", -- Needs review
+ CO_TOOLTIP_PETS = "Подсказки спутников", -- Needs review
+ CO_TOOLTIP_PETS_INFO = "Показать информацию о спутнике", -- Needs review
+ CO_TOOLTIP_PROFILE_ONLY = "Использовать, только если у цели есть профиль", -- Needs review
+ CO_TOOLTIP_RACE = "Показать расу, класс и уровень", -- Needs review
+ CO_TOOLTIP_REALM = "Показать игровой мир", -- Needs review
+ CO_TOOLTIP_RELATION = "Показывать цвет отношений", -- Needs review
+ CO_TOOLTIP_RELATION_TT = "Окрасить рамку подсказки персонажа в цвет, характеризующий отношение.", -- Needs review
+ CO_TOOLTIP_SPACING = "Показывать интервалы", -- Needs review
+ CO_TOOLTIP_SPACING_TT = "Располагает интервалы для облегчения подсказки, в стиле MyRolePlay.", -- Needs review
+ CO_TOOLTIP_SUBSIZE = "Размер вторичного шрифта", -- Needs review
+ CO_TOOLTIP_TARGET = "Показать цель", -- Needs review
+ CO_TOOLTIP_TERSIZE = "Размер третичного шрифта", -- Needs review
+ CO_TOOLTIP_TITLE = "Показывать заголовок", -- Needs review
+ CO_TOOLTIP_USE = "Использовать подсказку персонажей/спутников", -- Needs review
+ CO_WIM = "|cffff9900Каналы шепота отключены.", -- Needs review
+ CO_WIM_TT = "Вы используете мод |cff00ff00WIM|r, для совместимости отключена обработка каналов шепота отключена.", -- Needs review
+ DB_NOTIFICATIONS = "Уведомления панели управления", -- Needs review
+ DB_NOTIFICATIONS_ALL = "Все типы сообщений", -- Needs review
+ DB_NOTIFICATIONS_CLEAR = "Очистить все уведомления", -- Needs review
+ DB_NOTIFICATIONS_NO = "У вас нет уведомлений", -- Needs review
+ DB_STATUS = "Статус", -- Needs review
+ DB_STATUS_CURRENTLY = "Текущее (Отыгрываю)", -- Needs review
+ DB_STATUS_CURRENTLY_COMMON = "Эти статусы будут показаны в подсказке вашего персонажа. Делайте их краткими, так как |cffff9900by по умолчанию игроки с TRP3 будут видеть только первые 140 символов", -- Needs review
+ DB_STATUS_CURRENTLY_OOC = "Другая информация (Вне отыгрыша)", -- Needs review
+ DB_STATUS_CURRENTLY_OOC_TT = "Здесь вы можете указать что-то важное о вас, как игроке, или что-нибудь еще вне отыгрыша.", -- Needs review
+ DB_STATUS_CURRENTLY_TT = "Здесь вы можете указать что-нибудь важное о вашем персонаже.", -- Needs review
+ DB_STATUS_RP = "Статус персонажа", -- Needs review
+ DB_STATUS_RP_EXP = "Опытный ролевик", -- Needs review
+ DB_STATUS_RP_EXP_TT = [=[Показывает, что вы опытный ролевик.
+Не добавляет никаких специальных иконок в вашу подсказку.]=], -- Needs review
+ DB_STATUS_RP_IC = "В роли", -- Needs review
+ DB_STATUS_RP_IC_TT = [=[Это значит, что сейчас вы отыгрываете своего персонажа.
+Все ваши действия рассматриваются как выполненные вашим персонажем.]=], -- Needs review
+ DB_STATUS_RP_OOC = "Вне роли", -- Needs review
+ DB_STATUS_RP_OOC_TT = [=[Вы вне роли.
+Ваши действия не могут быть связаны с вашим персонажем.]=], -- Needs review
+ DB_STATUS_RP_VOLUNTEER = "Волонтер", -- Needs review
+ DB_STATUS_RP_VOLUNTEER_TT = "Если выбрать этот статус, в вашей подсказке отобразится специальная иконка, показывающая ролевикам-новичкам, что Вы хотите помочь им.", -- Needs review
+ DB_STATUS_XP = "Статус ролевика", -- Needs review
+ DB_STATUS_XP_BEGINNER = "Новичок", -- Needs review
+ DB_STATUS_XP_BEGINNER_TT = "Если выбрать этот статус, в вашей подсказке отобразится специальная иконка, показывающая остальным ролевикам, что Вы - новичок.", -- Needs review
+ GEN_VERSION = "Версия: %s (Сборка %s)", -- Needs review
+ GEN_WELCOME_MESSAGE = "Спасибо за выбор Total RP3 (v %s)! Приятной игры!",
+ PR_CO_MASTERS = "Хозяева", -- Needs review
+ PR_CO_PET = "Питомец", -- Needs review
+ PR_PROFILE_CREATED = "Профиль \"%s\" создан.", -- Needs review
+ PR_PROFILE_DELETED = "Профиль \"%s\" удален.", -- Needs review
+ PR_PROFILE_DETAIL = "Этот профиль на данный момент привязан к следующим персонажам WoW", -- Needs review
+ PR_UNUSED_PROFILE = "Этот профиль на данный момент не привязан к какому-либо персонажу WoW.", -- Needs review
+ REG_COMPANION = "Спутник", -- Needs review
+ REG_COMPANION_INFO = "Информация", -- Needs review
+ REG_COMPANION_NAME = "Имя", -- Needs review
+ REG_COMPANION_NAME_COLOR = "Цвет имени", -- Needs review
+ REG_COMPANION_PROFILES = "Профили спутников", -- Needs review
+ REG_COMPANIONS = "Спутники", -- Needs review
+ REG_COMPANION_TF_BOUND_TO = "Выбрать профиль", -- Needs review
+ REG_COMPANION_TF_CREATE = "Создать новый профиль", -- Needs review
+ REG_COMPANION_TF_NO = "Нет профиля", -- Needs review
+ REG_COMPANION_TF_OPEN = "Открыть страницу", -- Needs review
+ REG_COMPANION_TF_PROFILE = "Профиль спутника", -- Needs review
+ REG_COMPANION_TF_PROFILE_MOUNT = "Профиль ездового животного", -- Needs review
+ REG_COMPANION_TITLE = "Название", -- Needs review
+ REG_DELETE_WARNING = [=[Вы уверены, что хотите удалить профиль "%s"?
+]=], -- Needs review
+ REG_IGNORE_TOAST = "Персонаж игнорируется", -- Needs review
+ REG_LIST_ACTIONS_MASS_IGNORE = "Игнорировать профили", -- Needs review
+ REG_LIST_ACTIONS_MASS_REMOVE = "Удалить профили", -- Needs review
+ REG_LIST_ACTIONS_MASS_REMOVE_C = "Это действие удалит |cff00ff00%s выбранный(е) профиль(и)|r.", -- Needs review
+ REG_LIST_PET_MASTER = "Имя хозяина", -- Needs review
+ REG_LIST_PET_NAME = "Имя спутника", -- Needs review
+ REG_LIST_PETS_EMPTY = "Нет спутника", -- Needs review
+ REG_LIST_PETS_EMPTY2 = "Ни один спутник не подходит под ваш выбор", -- Needs review
+ REG_LIST_PETS_FILTER = "Спутники: %s / %s", -- Needs review
+ REG_LIST_PETS_TITLE = "Список спутников", -- Needs review
+ REG_LIST_PET_TYPE = "Тип спутника", -- Needs review
+ REG_PLAYER = "Персонаж", -- Needs review
+ REG_PLAYER_ABOUT = "О персонаже", -- Needs review
+ REG_PLAYER_ABOUT_ADD_FRAME = "Добавить окно", -- Needs review
+ REG_PLAYER_ABOUT_EMPTY = "Нет описания", -- Needs review
+ REG_PLAYER_ABOUTS = "О %s", -- Needs review
+ REG_PLAYER_CLASS = "Класс", -- Needs review
+ REG_PLAYER_CLASS_TT = [=[Это нестандартный класс вашего персонажа.
+
+|cff00ff00Например:|r
+Рыцарь, Пиротехник, Некромант, Элитный стрелок, Чародей, ...]=], -- Needs review
+ REG_PLAYER_COLOR_CLASS = "Цвет класса", -- Needs review
+ REG_PLAYER_COLOR_TT = [=[|cffffff00ЛКМ:|r Выбрать цвет
+|cffffff00ПКМ:|r Сбросить цвет]=], -- Needs review
+ REG_PLAYER_EYE = "Цвет глаз", -- Needs review
+ REG_PLAYER_GLANCE_PRESET = "Загрузить заготовку", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_ALERT1 = "Пожалуйста, введите категорию и название", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_ALERT2 = "Уже существует заготовка под названием %s", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_CATEGORY = "Категория заготовки", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_NAME = "Название заготовки", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_NONE = "Очистить слот", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_SAVE = "Сохранить информацию как заготовку", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_SAVE_SMALL = "Сохранить как заготовку", -- Needs review
+ REG_PLAYER_GLANCE_PRESET_SELECT = "Выбрать заготовку", -- Needs review
+ REG_PLAYER_MSP_NICK = "Ник", -- Needs review
+ REG_PLAYER_NAMESTITLES = "Имена и названия", -- Needs review
+ REG_PLAYER_NO_CHAR = "Нет характеристик", -- Needs review
+ REG_PLAYER_PEEK = "Разное", -- Needs review
+ REG_PLAYER_PHYSICAL = "Физические характеристики", -- Needs review
+ REG_PLAYER_RACE = "Раса", -- Needs review
+ REG_PLAYER_STYLE_FREQ_1 = "Всегда в роли", -- Needs review
+ REG_PLAYER_STYLE_FREQ_5 = "Всегда вне роли, этот персонаж не для отыгрыша", -- Needs review
+ REG_PLAYER_STYLE_GUILD = "Членство в гильдии", -- Needs review
+ REG_PLAYER_TRP2_PIERCING = "Пирсинг", -- Needs review
+ REG_PLAYER_TRP2_TATTOO = "Татуировки", -- Needs review
+ REG_PLAYER_TRP2_TRAITS = "Облик", -- Needs review
+ TB_SWITCH_HELM_1 = "Отображать шлем", -- Needs review
+ TB_SWITCH_HELM_2 = "Скрыть шлем", -- Needs review
+ TB_SWITCH_HELM_OFF = "Шлем: |cffff0000Скрыт", -- Needs review
+ TB_SWITCH_HELM_ON = "Шлем: |cffff0000Показан", -- Needs review
+ TF_OPEN_COMPANION = "Показать страницу спутника", -- Needs review
+ UI_COLOR_BROWSER_SELECT = "Выбрать цвет", -- Needs review
+ UI_FILTER = "Фильтер", -- Needs review
+ UI_ICON_BROWSER_HELP = "Скопировать иконку", -- Needs review
+ UI_ICON_SELECT = "Выбрать иконку", -- Needs review
+ UI_IMAGE_BROWSER = "Обозреватель изображений", -- Needs review
+ UI_IMAGE_SELECT = "Выбрать изображение", -- Needs review
+ UI_LINK_TEXT = "Введите текст", -- Needs review
+ UI_LINK_URL = "http://адрес_вашего_сайта", -- Needs review
+ UI_MUSIC_BROWSER = "Обозреватель музыки", -- Needs review
+ UI_MUSIC_SELECT = "Выбрать музыку", -- Needs review
+ UI_TUTO_BUTTON = "Обучающий режим", -- Needs review
+ UI_TUTO_BUTTON_TT = "Нажмите, чтобы включить/выключить режим обучения", -- Needs review
+ }
+ ,
+};
+
+TRP3_API.locale.registerLocale(LOCALE);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/locale/locale_zhCN.lua b/totalRP3/tags/0.2.7/core/impl/locale/locale_zhCN.lua
new file mode 100644
index 000000000..5f4dd922e
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/locale/locale_zhCN.lua
@@ -0,0 +1,125 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Chinese locale
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local LOCALE = {
+ locale = "zhCN",
+ localeText = "Chinese",
+ localeContent = {
+ ABOUT_TITLE = "关于",
+ BINDING_NAME_TRP3_TOGGLE = "Toggle主界面", -- Needs review
+ BINDING_NAME_TRP3_TOOLBAR_TOGGLE = "Toggle工具栏", -- Needs review
+ BW_COLOR_CODE = "颜色代码",
+ BW_COLOR_CODE_ALERT = "错误的十六进制代码!", -- Needs review
+ BW_COLOR_CODE_TT = "您可以在这里黏贴一个代表颜色的6位数十六进制代码, 然后按下回车。", -- Needs review
+ CM_ACTIONS = "动作", -- Needs review
+ CM_APPLY = "应用",
+ CM_CANCEL = "取消",
+ CM_CENTER = "中心", -- Needs review
+ CM_CLASS_DEATHKNIGHT = "死亡骑士",
+ CM_CLASS_DRUID = "德鲁伊",
+ CM_CLASS_HUNTER = "猎人",
+ CM_CLASS_MAGE = "法师",
+ CM_CLASS_MONK = "武僧",
+ CM_CLASS_PALADIN = "圣骑士",
+ CM_CLASS_PRIEST = "牧师",
+ CM_CLASS_ROGUE = "潜行者",
+ CM_CLASS_SHAMAN = "萨满",
+ CM_CLASS_UNKNOWN = "未知",
+ CM_CLASS_WARLOCK = "术士",
+ CM_CLASS_WARRIOR = "战士",
+ CM_CLICK = "点击", -- Needs review
+ CM_COLOR = "颜色",
+ CM_CTRL = "Ctrl", -- Needs review
+ CM_DRAGDROP = "拖放", -- Needs review
+ CM_EDIT = "编辑",
+ CM_IC = "扮演中(IC)", -- Needs review
+ CM_ICON = "图标",
+ CM_IMAGE = "图片", -- Needs review
+ CM_L_CLICK = "鼠标左键点击", -- Needs review
+ CM_LEFT = "左边", -- Needs review
+ CM_LINK = "链接", -- Needs review
+ CM_LOAD = "读取", -- Needs review
+ CM_MOVE_DOWN = "向下移动", -- Needs review
+ CM_MOVE_UP = "向上移动", -- Needs review
+ CM_NAME = "角色名", -- Needs review
+ CM_OOC = "非扮演中(OOC)", -- Needs review
+ CM_OPEN = "打开",
+ CM_PLAY = "播放", -- Needs review
+ CM_R_CLICK = "鼠标右键点击", -- Needs review
+ CM_REMOVE = "移除", -- Needs review
+ CM_RIGHT = "右边", -- Needs review
+ CM_SAVE = "保存",
+ CM_SELECT = "选取",
+ CM_SHIFT = "Shift", -- Needs review
+ CM_SHOW = "显示", -- Needs review
+ CM_STOP = "停止", -- Needs review
+ CM_UNKNOWN = "未知",
+ CM_VALUE = "值", -- Needs review
+ CO_ANCHOR_BOTTOM = "下方", -- Needs review
+ CO_ANCHOR_BOTTOM_LEFT = "左下方", -- Needs review
+ CO_ANCHOR_BOTTOM_RIGHT = "右下方", -- Needs review
+ CO_ANCHOR_LEFT = "左边", -- Needs review
+ CO_ANCHOR_RIGHT = "右边", -- Needs review
+ CO_ANCHOR_TOP = "上方", -- Needs review
+ CO_ANCHOR_TOP_LEFT = "左上方", -- Needs review
+ CO_ANCHOR_TOP_RIGHT = "右上方", -- Needs review
+ CO_CHAT = "聊天栏设置", -- Needs review
+ CO_CHAT_MAIN = "聊天栏主要设置", -- Needs review
+ CO_CHAT_MAIN_COLOR = "为姓名使用自定义颜色", -- Needs review
+ CO_CHAT_MAIN_NAMING = "命名方法", -- Needs review
+ CO_CHAT_MAIN_NAMING_1 = "使用原角色名", -- Needs review
+ CO_CHAT_MAIN_NAMING_2 = "使用自定角色名", -- Needs review
+ CO_CHAT_MAIN_NAMING_3 = "名+姓", -- Needs review
+ CO_CHAT_USE_SAY = "说", -- Needs review
+ CO_CONFIGURATION = "设置", -- Needs review
+ CO_GENERAL_CHANGELOCALE_ALERT = [=[是否现在重新载入界面使语言改变为%s?
+
+如果选择不重新载入,语言将在下次登录时改变。]=], -- Needs review
+ CO_GENERAL_HEAVY = "档案过大警告", -- Needs review
+ CO_GENERAL_HEAVY_TT = "当你的档案总大小超过一个合理值时收到一个警告", -- Needs review
+ CO_GENERAL_LOCALE = "插件所在位置", -- Needs review
+ CO_GENERAL_MISC = "杂项", -- Needs review
+ CO_GENERAL_NEW_VERSION = "更新提醒", -- Needs review
+ CO_GENERAL_NEW_VERSION_TT = "有更新档时收到一个提醒", -- Needs review
+ CO_GENERAL_NOTIF = "通知", -- Needs review
+ CO_GENERAL_UI_ANIMATIONS = "界面动画", -- Needs review
+ CO_GENERAL_UI_ANIMATIONS_TT = "激活界面动画", -- Needs review
+ CO_GENERAL_UI_SOUNDS = "界面音效", -- Needs review
+ CO_GENERAL_UI_SOUNDS_TT = "激活界面音效(当打开窗口,切换选项卡,点击按键时)", -- Needs review
+ CO_GLANCE_LOCK = "锁定栏", -- Needs review
+ CO_GLANCE_LOCK_TT = "防止栏被拖动", -- Needs review
+ COM_LIST = "命令列表:", -- Needs review
+ COM_RESET_RESET = "界面位置已经被重置!", -- Needs review
+ GEN_WELCOME_MESSAGE = "感谢您使用Total RP 3 (v %s)!祝您玩的开心!",
+ TB_STATUS = "玩家", -- Needs review
+ TB_SWITCH_CAPE_2 = "隐藏披风", -- Needs review
+ TB_SWITCH_HELM_1 = "显示头盔", -- Needs review
+ TB_SWITCH_HELM_2 = "隐藏头盔", -- Needs review
+ TB_SWITCH_TOOLBAR = "切换工具条", -- Needs review
+ TB_TOOLBAR = "工具条", -- Needs review
+ TF_IGNORE = "屏蔽玩家", -- Needs review
+ TF_OPEN_CHARACTER = "显示角色页面", -- Needs review
+ TF_PLAY_THEME = "扮演角色主题", -- Needs review
+ UI_BKG = "背景 %s", -- Needs review
+ UI_CLOSE_ALL = "关闭所有", -- Needs review
+ UI_COLOR_BROWSER_SELECT = "选择颜色", -- Needs review
+ }
+};
+
+TRP3_API.locale.registerLocale(LOCALE);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/main_structure.lua b/totalRP3/tags/0.2.7/core/impl/main_structure.lua
new file mode 100644
index 000000000..9bc2a997b
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/main_structure.lua
@@ -0,0 +1,447 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Navigation API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- Public accessor
+TRP3_API.navigation = {
+ menu = {
+ id = {}
+ },
+ page = {
+ id = {}
+ }
+};
+
+-- imports
+local Log = TRP3_API.utils.log;
+local CreateFrame = CreateFrame;
+local loc = TRP3_API.locale.getText;
+local playUISound = TRP3_API.ui.misc.playUISound;
+local TRP3_TutorialFrame, TRP3_TutorialTooltip, TRP3_MainTutorialButton = TRP3_TutorialFrame, TRP3_TutorialTooltip, TRP3_MainTutorialButton;
+local TRP3_MainFrameMenuContainer, TRP3_MainFramePageContainer, TRP3_MainFrame = TRP3_MainFrameMenuContainer, TRP3_MainFramePageContainer, TRP3_MainFrame;
+local assert, pairs, tinsert, table, error, type, _G = assert, pairs, tinsert, table, error, type, _G;
+local selectMenu, unregisterMenu;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Menu management
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Placeholder for menu structures
+local menuStructures = {};
+-- The currently selected menuId
+local selectedMenuId;
+-- Placeholder for menu ui button
+local uiMenuWidgets = {};
+-- Determine the original top margin from where the first button is placed
+local marginTop = -5;
+-- Menu button height, determine the vertical gap between each button
+local buttonHeight = 25;
+
+local function onMenuClick(menu)
+ assert(menu.id, "Menu button does not have a attached menu id.");
+ selectMenu(menu.id);
+end
+
+local function onMenuClosed(menu)
+ assert(menu:GetParent().id, "Menu button does not have a attached menu id.");
+ unregisterMenu(menu:GetParent().id);
+end
+
+local function isCloseable(menuID)
+ return menuStructures[menuID] and menuStructures[menuID].closeable;
+end
+
+local function closeAll(parentMenuID)
+ assert(parentMenuID, "No parent menu ID in close all button.");
+ for id, menuStructure in pairs(menuStructures) do
+ if menuStructure.isChildOf == parentMenuID and isCloseable(id) then
+ unregisterMenu(id);
+ end
+ end
+end
+
+local closeAllButton = CreateFrame("Button", "TRP3_MainFrameMenuButtonCloseAll", TRP3_MainFrameMenuContainer, "TRP3_CommonButton");
+
+-- The menu is built by SORTED menu item key.
+local function rebuildMenu()
+ -- Hide all
+ closeAllButton:Hide();
+ for _, widget in pairs(uiMenuWidgets) do
+ widget:Hide();
+ end
+
+ -- Sort menu by name
+ -- Only take visible menu
+ local ids = {};
+ for id, menuStructure in pairs(menuStructures) do
+ if not menuStructure.hidden then
+ tinsert(ids, id);
+ end
+ end
+ table.sort(ids);
+
+ local closeableChildCount = 0;
+ local index = 0;
+ local y = marginTop;
+ local latestID;
+ for i, id in pairs(ids) do
+ local menuStructure = menuStructures[id];
+ -- if Top button || Selected parent || Selected sibling
+ if not menuStructure.isChildOf or menuStructure.isChildOf == selectedMenuId or (selectedMenuId and menuStructures[selectedMenuId].isChildOf == menuStructure.isChildOf) then
+ local uiButton = uiMenuWidgets[index+1];
+ if uiButton == nil then -- Create the button
+ uiButton = CreateFrame("Button", "TRP3_MainFrameMenuButton"..index, TRP3_MainFrameMenuContainer, "TRP3_CategoryButton");
+ uiButton:SetScript("OnClick", onMenuClick);
+ _G[uiButton:GetName().."Close"]:SetScript("OnClick", onMenuClosed);
+ tinsert(uiMenuWidgets, uiButton);
+ end
+ uiButton:Enable();
+ uiButton:UnlockHighlight();
+
+ if id == selectedMenuId then
+ uiButton:Disable();
+ uiButton:LockHighlight();
+ end
+ uiButton:ClearAllPoints();
+
+ local label = _G[uiButton:GetName().."Label"];
+ local close = _G[uiButton:GetName().."Close"];
+ close:Hide();
+ if menuStructure.isChildOf then
+ uiButton:SetPoint("LEFT", 30, y);
+ uiButton:SetPoint("RIGHT", -15, y);
+ label:SetTextColor(1, 1, 1);
+ label:SetJustifyH(menuStructure.align or "RIGHT");
+ if isCloseable(id) then
+ closeableChildCount = closeableChildCount + 1;
+ close:Show();
+ end
+ else
+ uiButton:SetPoint("LEFT", 0, y);
+ uiButton:SetPoint("RIGHT", -15, y);
+ label:SetTextColor(1, 0.75, 0);
+ label:SetJustifyH(menuStructure.align or "LEFT");
+ end
+ label:SetText(menuStructure.text);
+
+ local icon = _G[uiButton:GetName().."Icon"];
+ icon:Hide();
+ if menuStructure.icon then
+ icon:Show();
+ icon:SetTexture(menuStructure.icon);
+ end
+
+ latestID = id;
+ uiButton:Show();
+ uiButton.id = id;
+ index = index + 1;
+ y = y - buttonHeight;
+
+ if closeableChildCount > 0 and menuStructure.isChildOf and menuStructures[menuStructure.isChildOf].closeable and (not ids[i + 1] or not menuStructures[ids[i + 1]].isChildOf) then
+ -- Place close all button
+ closeAllButton:SetPoint("LEFT", 32, y);
+ closeAllButton:SetPoint("RIGHT", -20, y);
+ closeAllButton.parentMenu = menuStructure.isChildOf;
+ closeAllButton:Show();
+ y = y - buttonHeight;
+ end
+ end
+ end
+end
+TRP3_API.navigation.menu.rebuildMenu = rebuildMenu;
+
+-- Register a menu structure
+-- Automatically refresh the menu display
+local function registerMenu(menuStructure)
+ assert(menuStructure and menuStructure.id, "menuStructure must have an id field.");
+ assert(not menuStructures[menuStructure.id], "The menu with id "..(menuStructure.id).." has already been registered.");
+ menuStructures[menuStructure.id] = menuStructure;
+ rebuildMenu();
+end
+TRP3_API.navigation.menu.registerMenu = registerMenu;
+
+-- Unregister a menu structure.
+-- Automatically refresh the menu display
+function unregisterMenu(menuId)
+ if selectedMenuId == menuId then
+ if menuStructures[menuId].isChildOf then
+ selectMenu(menuStructures[menuId].isChildOf);
+ else
+ error("Cannot unregister the current selected menu entry");
+ end
+ end
+ menuStructures[menuId] = nil;
+ rebuildMenu();
+end
+TRP3_API.navigation.menu.unregisterMenu = unregisterMenu;
+
+-- Set a menu or submenu as selected
+selectMenu = function(menuId)
+ assert(menuStructures[menuId], "Unknown menuId "..menuId);
+ selectedMenuId = menuId;
+ rebuildMenu();
+ if menuStructures[menuId].onSelected then
+ menuStructures[menuId].onSelected();
+ end
+ TRP3_API.popup.hidePopups();
+end
+TRP3_API.navigation.menu.selectMenu = selectMenu;
+
+-- Use to access and change menu properties.
+-- Any properties can be changed but rebuildMenu must be called in order to apply these changes.
+local function getMenuItem(menuId)
+ assert(menuStructures[menuId], "Unknown menuId "..menuId);
+ return menuStructures[menuId];
+end
+TRP3_API.navigation.menu.getMenuItem = getMenuItem;
+
+TRP3_API.navigation.menu.isMenuRegistered = function(menuID)
+ return menuStructures[menuID] ~= nil;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Main structure & page system
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Placeholder for page structure
+local pageStructures = {};
+-- Currently displayed page
+local currentPageId;
+local currentContext;
+
+local function checkPageSelection()
+ if currentPageId == nil then
+ -- TODO: what to do ?
+ end
+end
+
+local function registerPage(pageStructure)
+ assert(pageStructure and pageStructure.id, "pageStructure must have an id field.");
+ assert(pageStructure.frame or (pageStructure.templateName and pageStructure.frameName), "pageStructure must have a frame or a templateName and a frameName field.");
+ assert(not pageStructures[pageStructure.id], "The page with id "..(pageStructure.id).." has already been registered.");
+ pageStructures[pageStructure.id] = pageStructure;
+end
+TRP3_API.navigation.page.registerPage = registerPage;
+
+local function setPage(pageId, context)
+ Log.log("setPage: "..pageId);
+
+ assert(pageStructures[pageId], "Unknown pageId "..pageId);
+ assert(context == nil or type(context) == "table", "Context must be a table or nil.");
+
+ if currentPageId then -- Hide current page
+ if pageStructures[currentPageId].frame then
+ pageStructures[currentPageId].frame:Hide();
+ end
+ end
+
+ currentPageId = pageId;
+ currentContext = context;
+ local currentPage = pageStructures[currentPageId];
+ if not currentPage.frame then
+ if not _G[currentPage.frameName] then
+ -- Create new frame
+ CreateFrame("Frame", currentPage.frameName, TRP3_MainFramePageContainer, currentPage.templateName);
+ end
+ currentPage.frame = _G[currentPage.frameName];
+ end
+
+ -- Show
+ if currentPage.onPagePreShow then
+ currentPage.onPagePreShow(context);
+ end
+
+ currentPage.frame:ClearAllPoints();
+ currentPage.frame:SetParent(TRP3_MainFramePageContainer);
+ currentPage.frame:SetPoint("TOPRIGHT", 0, 0);
+ currentPage.frame:SetPoint("BOTTOMLEFT", 0, 0);
+ currentPage.frame:Show();
+
+ -- Show
+ if currentPage.onPagePostShow then
+ currentPage.onPagePostShow(context);
+ end
+
+ TRP3_API.events.fireEvent(TRP3_API.events.NAVIGATION_TUTORIAL_REFRESH, pageId);
+ playUISound("gsCharacterSelection");
+end
+TRP3_API.navigation.page.setPage = setPage;
+
+local function getCurrentContext()
+ return currentContext;
+end
+TRP3_API.navigation.page.getCurrentContext = getCurrentContext;
+
+local function getCurrentPageID()
+ return currentPageId;
+end
+TRP3_API.navigation.page.getCurrentPageID = getCurrentPageID;
+
+TRP3_API.navigation.openMainFrame = function()
+ TRP3_MainFrame:Show();
+end
+
+local function switchMainFrame()
+ if TRP3_MainFrame:IsVisible() then
+ TRP3_MainFrame:Hide();
+ TRP3_API.ui.misc.playUISound("AchievementMenuClose");
+ else
+ TRP3_MainFrame:Show();
+ TRP3_API.ui.misc.playUISound("AchievementMenuOpen");
+ end
+end
+TRP3_API.navigation.switchMainFrame = switchMainFrame;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Tutorial frame
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local BUTTONS = {};
+
+local function buttonOnLeave(button)
+ button.box:Show();
+ button.boxHighlight:Hide();
+ TRP3_TutorialTooltip:ClearAllPoints();
+ TRP3_TutorialTooltip.ArrowRIGHT:Hide();
+ TRP3_TutorialTooltip.ArrowGlowRIGHT:Hide();
+ TRP3_TutorialTooltip.ArrowUP:Hide();
+ TRP3_TutorialTooltip.ArrowGlowUP:Hide();
+ TRP3_TutorialTooltip.ArrowDOWN:Hide();
+ TRP3_TutorialTooltip.ArrowGlowDOWN:Hide();
+ TRP3_TutorialTooltip.ArrowLEFT:Hide();
+ TRP3_TutorialTooltip.ArrowGlowLEFT:Hide();
+ TRP3_TutorialTooltip:Hide();
+end
+
+local function buttonOnEnter(button)
+ button.box:Hide();
+ button.boxHighlight:Show();
+
+ if button.arrow == "RIGHT" then
+ TRP3_TutorialTooltip:SetPoint("LEFT", button, "RIGHT", 10, 0);
+ TRP3_TutorialTooltip.ArrowRIGHT:Show();
+ TRP3_TutorialTooltip.ArrowGlowRIGHT:Show();
+ elseif button.arrow == "LEFT" then
+ TRP3_TutorialTooltip:SetPoint("RIGHT", button, "LEFT", -10, 0);
+ TRP3_TutorialTooltip.ArrowLEFT:Show();
+ TRP3_TutorialTooltip.ArrowGlowLEFT:Show();
+ elseif button.arrow == "UP" then
+ TRP3_TutorialTooltip:SetPoint("BOTTOM", button, "TOP", 0, 10);
+ TRP3_TutorialTooltip.ArrowUP:Show();
+ TRP3_TutorialTooltip.ArrowGlowUP:Show();
+ else
+ TRP3_TutorialTooltip:SetPoint("TOP", button, "BOTTOM", 0, -10);
+ TRP3_TutorialTooltip.ArrowDOWN:Show();
+ TRP3_TutorialTooltip.ArrowGlowDOWN:Show();
+ end
+
+ TRP3_TutorialTooltip:SetWidth(button.textWidth);
+ TRP3_TutorialTooltip.Text:SetWidth(button.textWidth - 30);
+ TRP3_TutorialTooltip.Text:SetText(button.text);
+ TRP3_TutorialTooltip:Show();
+end
+
+local function configureButton(button)
+ button:SetSize(46, 46);
+ button:SetScript("OnEnter", buttonOnEnter);
+ button:SetScript("OnLeave", buttonOnLeave);
+end
+
+local function showTutorial(tutorialStructure)
+ -- Hide all
+ for _, buttonWidget in pairs(BUTTONS) do
+ buttonWidget:Hide();
+ buttonWidget.box:Hide();
+ buttonWidget.boxHighlight:Hide();
+ end
+
+ for frameIndex, frameInfo in pairs(tutorialStructure) do
+ if not BUTTONS[frameIndex] then
+ BUTTONS[frameIndex] = CreateFrame( "Button", nil, TRP3_TutorialFrame, "TRP3_TutorialButton" );
+ BUTTONS[frameIndex].box = CreateFrame( "Frame", nil, TRP3_TutorialFrame, "HelpPlateBox" );
+ BUTTONS[frameIndex].boxHighlight = CreateFrame( "Frame", nil, TRP3_TutorialFrame, "HelpPlateBoxHighlight" );
+ configureButton(BUTTONS[frameIndex]);
+ end
+ local buttonWidget = BUTTONS[frameIndex];
+ buttonWidget:ClearAllPoints();
+ buttonWidget:SetPoint( frameInfo.button.anchor, buttonWidget.box, frameInfo.button.anchor, frameInfo.button.x, frameInfo.button.y );
+ buttonWidget:Show();
+ buttonWidget.arrow = frameInfo.button.arrow or "RIGHT";
+ buttonWidget.text = frameInfo.button.text;
+ buttonWidget.textWidth = frameInfo.button.textWidth or 220;
+
+ local box = buttonWidget.box;
+ box:ClearAllPoints();
+ if frameInfo.box.allPoints then
+ box:SetAllPoints(frameInfo.box.allPoints);
+ else
+ box:SetSize(frameInfo.box.width, frameInfo.box.height);
+ box:SetPoint( frameInfo.box.anchor, TRP3_TutorialFrame, frameInfo.box.anchor, frameInfo.box.x, frameInfo.box.y );
+ end
+
+ box:Show();
+
+ local highlight = buttonWidget.boxHighlight;
+ highlight:ClearAllPoints();
+ if frameInfo.box.allPoints then
+ highlight:SetAllPoints(frameInfo.box.allPoints);
+ else
+ highlight:SetSize(frameInfo.box.width, frameInfo.box.height);
+ highlight:SetPoint( frameInfo.box.anchor, TRP3_TutorialFrame, frameInfo.box.anchor, frameInfo.box.x, frameInfo.box.y );
+ end
+ highlight:Hide();
+ end
+ TRP3_TutorialFrame:Show();
+end
+
+local function onTutorialRefresh(pageID)
+ if currentPageId == pageID then
+ local currentPage = pageStructures[currentPageId];
+ TRP3_TutorialFrame:Hide();
+ if currentPage.tutorialProvider and currentPage.tutorialProvider() then
+ TRP3_MainTutorialButton:Show();
+ TRP3_MainTutorialButton.provider = currentPage.tutorialProvider;
+ else
+ TRP3_MainTutorialButton:Hide();
+ end
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Init
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+TRP3_API.navigation.init = function()
+ TRP3_MainFrame:SetScript("OnShow", function() checkPageSelection() end);
+ TRP3_MainFrameClose:SetScript("OnClick", function() switchMainFrame() end);
+
+ TRP3_MainTutorialButton:SetScript("OnClick", function(self)
+ if TRP3_TutorialFrame:IsShown() then
+ TRP3_TutorialFrame:Hide();
+ elseif not TRP3_PopupsFrame:IsShown() and self.provider and self.provider() then
+ showTutorial(self.provider());
+ end
+ end);
+ TRP3_API.ui.tooltip.setTooltipAll(TRP3_MainTutorialButton, "TOP", 0, 0, loc("UI_TUTO_BUTTON"), loc("UI_TUTO_BUTTON_TT"));
+ closeAllButton:SetText(loc("UI_CLOSE_ALL"));
+ closeAllButton:SetScript("OnClick", function(self)
+ closeAll(self.parentMenu);
+ end);
+
+ TRP3_API.events.listenToEvent(TRP3_API.events.NAVIGATION_TUTORIAL_REFRESH, onTutorialRefresh);
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/popup.lua b/totalRP3/tags/0.2.7/core/impl/popup.lua
new file mode 100644
index 000000000..49a3c1aa2
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/popup.lua
@@ -0,0 +1,629 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Popups API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- Public accessor
+TRP3_API.popup = {};
+
+-- imports
+local Utils = TRP3_API.utils;
+local loc, table = TRP3_API.locale.getText, table;
+local initList = TRP3_API.ui.list.initList;
+local tinsert, _G, pairs, wipe, math, assert = tinsert, _G, pairs, wipe, math, assert;
+local handleMouseWheel = TRP3_API.ui.list.handleMouseWheel;
+local setTooltipForFrame, setTooltipForSameFrame = TRP3_API.ui.tooltip.setTooltipForFrame, TRP3_API.ui.tooltip.setTooltipForSameFrame;
+local hooksecurefunc, GetItemIcon, IsControlKeyDown = hooksecurefunc, GetItemIcon, IsControlKeyDown;
+local getIconList, getIconListSize, getImageList, getImageListSize, getMusicList, getMusicListSize;
+local hexaToNumber, numberToHexa = TRP3_API.utils.color.hexaToNumber, TRP3_API.utils.color.numberToHexa;
+local strconcat = strconcat;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Static popups definition
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+StaticPopupDialogs["TRP3_INFO"] = {
+ button1 = OKAY,
+ timeout = false,
+ whileDead = true,
+ hideOnEscape = true
+};
+
+StaticPopupDialogs["TRP3_CONFIRM"] = {
+ button1 = ACCEPT,
+ button2 = CANCEL,
+ OnAccept = function(self)
+ if StaticPopupDialogs["TRP3_CONFIRM"].trp3onAccept then
+ StaticPopupDialogs["TRP3_CONFIRM"].trp3onAccept();
+ end
+ end,
+ OnCancel = function(arg1,arg2)
+ if StaticPopupDialogs["TRP3_CONFIRM"].trp3onCancel then
+ StaticPopupDialogs["TRP3_CONFIRM"].trp3onCancel();
+ end
+ end,
+ timeout = false,
+ whileDead = true,
+ hideOnEscape = true,
+ showAlert = true,
+};
+
+StaticPopupDialogs["TRP3_INPUT_TEXT"] = {
+ button1 = ACCEPT,
+ button2 = CANCEL,
+ OnShow = function(self)
+ _G[self:GetName().."EditBox"]:SetNumeric(false);
+ end,
+ OnAccept = function(self)
+ if StaticPopupDialogs["TRP3_INPUT_TEXT"].trp3onAccept then
+ StaticPopupDialogs["TRP3_INPUT_TEXT"].trp3onAccept(_G[self:GetName().."EditBox"]:GetText());
+ end
+ end,
+ OnCancel = function(arg1,arg2)
+ if StaticPopupDialogs["TRP3_INPUT_TEXT"].trp3onCancel then
+ StaticPopupDialogs["TRP3_INPUT_TEXT"].trp3onCancel();
+ end
+ end,
+ EditBoxOnEnterPressed = function(self)
+ self:GetParent().button1:GetScript("OnClick")(self:GetParent().button1);
+ end,
+ EditBoxOnEscapePressed = function(self)
+ self:GetParent().button2:GetScript("OnClick")(self:GetParent().button2);
+ end,
+ timeout = false,
+ whileDead = true,
+ hideOnEscape = true,
+ hasEditBox = true,
+};
+
+StaticPopupDialogs["TRP3_INPUT_NUMBER"] = {
+ button1 = ACCEPT,
+ button2 = CANCEL,
+ OnShow = function(self)
+ _G[self:GetName().."EditBox"]:SetNumeric(true);
+ end,
+ OnAccept = function(self)
+ if StaticPopupDialogs["TRP3_INPUT_NUMBER"].trp3onAccept then
+ StaticPopupDialogs["TRP3_INPUT_NUMBER"].trp3onAccept(_G[self:GetName().."EditBox"]:GetNumber());
+ end
+ end,
+ OnHide = function(self)
+ _G[self:GetName().."EditBox"]:SetNumeric(false);
+ end,
+ OnCancel = function(arg1,arg2)
+ if StaticPopupDialogs["TRP3_INPUT_NUMBER"].trp3onCancel then
+ StaticPopupDialogs["TRP3_INPUT_NUMBER"].trp3onCancel();
+ end
+ end,
+ EditBoxOnEnterPressed = function(self)
+ self:GetParent().button1:GetScript("OnClick")(self:GetParent().button1);
+ end,
+ EditBoxOnEscapePressed = function(self)
+ self:GetParent().button2:GetScript("OnClick")(self:GetParent().button2);
+ end,
+ timeout = false,
+ whileDead = true,
+ hideOnEscape = true,
+ hasEditBox = true,
+};
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Static popups methods
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local POPUP_HEAD = "|TInterface\\AddOns\\totalRP3\\resources\\trp3logo:113:263|t\n \n";
+
+-- Show a simple alert with a OK button.
+function TRP3_API.popup.showAlertPopup(text)
+ StaticPopupDialogs["TRP3_INFO"].text = POPUP_HEAD..text;
+ local dialog = StaticPopup_Show("TRP3_INFO");
+ if dialog then
+ dialog:ClearAllPoints();
+ dialog:SetPoint("CENTER", UIParent, "CENTER");
+ end
+end
+
+function TRP3_API.popup.showConfirmPopup(text, onAccept, onCancel)
+ StaticPopupDialogs["TRP3_CONFIRM"].text = POPUP_HEAD..text.."\n\n";
+ StaticPopupDialogs["TRP3_CONFIRM"].trp3onAccept = onAccept;
+ StaticPopupDialogs["TRP3_CONFIRM"].trp3onCancel = onCancel;
+ local dialog = StaticPopup_Show("TRP3_CONFIRM");
+ if dialog then
+ dialog:ClearAllPoints();
+ dialog:SetPoint("CENTER", UIParent, "CENTER");
+ end
+end
+
+function TRP3_API.popup.showTextInputPopup(text, onAccept, onCancel, default)
+ StaticPopupDialogs["TRP3_INPUT_TEXT"].text = POPUP_HEAD..text.."\n\n";
+ StaticPopupDialogs["TRP3_INPUT_TEXT"].trp3onAccept = onAccept;
+ StaticPopupDialogs["TRP3_INPUT_TEXT"].trp3onCancel = onCancel;
+ local dialog = StaticPopup_Show("TRP3_INPUT_TEXT");
+ if dialog then
+ dialog:ClearAllPoints();
+ dialog:SetPoint("CENTER", UIParent, "CENTER");
+ _G[dialog:GetName().."EditBox"]:SetText(default or "");
+ _G[dialog:GetName().."EditBox"]:HighlightText();
+ end
+end
+
+function TRP3_API.popup.showNumberInputPopup(text, onAccept, onCancel, default)
+ StaticPopupDialogs["TRP3_INPUT_NUMBER"].text = POPUP_HEAD..text.."\n\n";
+ StaticPopupDialogs["TRP3_INPUT_NUMBER"].trp3onAccept = onAccept;
+ StaticPopupDialogs["TRP3_INPUT_NUMBER"].trp3onCancel = onCancel;
+ local dialog = StaticPopup_Show("TRP3_INPUT_NUMBER");
+ if dialog then
+ dialog:ClearAllPoints();
+ dialog:SetPoint("CENTER", UIParent, "CENTER");
+ _G[dialog:GetName().."EditBox"]:SetNumber(default or false);
+ _G[dialog:GetName().."EditBox"]:HighlightText();
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Dynamic popup
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local TRP3_PopupsFrame = TRP3_PopupsFrame;
+
+local function showPopup(popup)
+ for _, frame in pairs({TRP3_PopupsFrame:GetChildren()}) do
+ frame:Hide();
+ end
+ TRP3_PopupsFrame:Show();
+ popup:Show();
+end
+TRP3_API.popup.showPopup = showPopup;
+
+local function hidePopups()
+ TRP3_PopupsFrame:Hide();
+end
+TRP3_API.popup.hidePopups = hidePopups;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Music browser
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local musicWidgetTab = {};
+local filteredMusicList;
+
+local function decorateMusic(lineFrame, musicURL)
+ musicURL = filteredMusicList[musicURL];
+ local musicName = musicURL:reverse();
+ musicName = (musicName:sub(1, musicName:find("%\\")-1)):reverse();
+
+ setTooltipForFrame(lineFrame, lineFrame, "RIGHT", 0, -30, musicName,
+ ("|cff00ff00%s\n\n|cffff9900%s: |cffffffff%s\n|cffff9900%s: |cffffffff%s"):format(musicURL, loc("CM_L_CLICK"), loc("REG_PLAYER_ABOUT_MUSIC_SELECT2"), loc("CM_R_CLICK"), loc("REG_PLAYER_ABOUT_MUSIC_LISTEN")));
+ _G[lineFrame:GetName().."Text"]:SetText(musicName);
+ lineFrame.musicURL = musicURL;
+end
+
+local function onMusicClick(lineFrame, mousebutton)
+ if mousebutton == "LeftButton" then
+ hidePopups();
+ if TRP3_MusicBrowserContent.callback then
+ TRP3_MusicBrowserContent.callback(lineFrame.musicURL);
+ end
+ elseif lineFrame.musicURL then
+ Utils.music.play(lineFrame.musicURL);
+ end
+
+end
+
+local function filteredMusicBrowser()
+ local filter = TRP3_MusicBrowserFilterBox:GetText();
+ if filteredMusicList and filteredMusicList ~= getMusicList() then
+ wipe(filteredMusicList);
+ filteredMusicList = nil;
+ end
+ filteredMusicList = getMusicList(filter); -- Music tab is unfiltered
+
+ TRP3_MusicBrowserTotal:SetText( (#filteredMusicList) .. " / " .. getMusicListSize() );
+ initList(
+ {
+ widgetTab = musicWidgetTab,
+ decorate = decorateMusic
+ },
+ filteredMusicList,
+ TRP3_MusicBrowserContentSlider
+ );
+end
+
+local function initMusicBrowser()
+ handleMouseWheel(TRP3_MusicBrowserContent, TRP3_MusicBrowserContentSlider);
+ TRP3_MusicBrowserContentSlider:SetValue(0);
+ -- Create lines
+ for line = 0, 8 do
+ local lineFrame = CreateFrame("Button", "TRP3_MusicBrowserButton_"..line, TRP3_MusicBrowserContent, "TRP3_MusicBrowserLine");
+ lineFrame:SetPoint("TOP", TRP3_MusicBrowserContent, "TOP", 0, -10 + (line * (-31)));
+ lineFrame:SetScript("OnClick", onMusicClick);
+ tinsert(musicWidgetTab, lineFrame);
+ end
+
+ TRP3_MusicBrowserFilterBox:SetScript("OnTextChanged", filteredMusicBrowser);
+
+ TRP3_MusicBrowserTitle:SetText(loc("UI_MUSIC_BROWSER"));
+ TRP3_MusicBrowserFilterBoxText:SetText(loc("UI_FILTER"));
+ TRP3_MusicBrowserFilterStop:SetText(loc("REG_PLAYER_ABOUT_MUSIC_STOP"));
+ filteredMusicBrowser();
+end
+
+function TRP3_API.popup.showMusicBrowser(callback)
+ TRP3_MusicBrowserContent.callback = callback;
+ TRP3_MusicBrowserFilterBox:SetText("");
+ showPopup(TRP3_MusicBrowser);
+ TRP3_MusicBrowserFilterBox:SetFocus();
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Icon browser
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local TRP3_IconBrowser = TRP3_IconBrowser;
+local iconWidgetTab = {};
+local filteredIconList = {};
+local ui_IconBrowserContent = TRP3_IconBrowserContent;
+
+local function decorateIcon(icon, index)
+ icon:SetNormalTexture("Interface\\ICONS\\"..filteredIconList[index]);
+ icon:SetPushedTexture("Interface\\ICONS\\"..filteredIconList[index]);
+ setTooltipForFrame(icon, TRP3_IconBrowser, "RIGHT", 0, -100, Utils.str.icon(filteredIconList[index], 75), filteredIconList[index]);
+ icon.index = index;
+end
+
+local function onIconClick(icon)
+ hidePopups();
+ if ui_IconBrowserContent.onSelectCallback then
+ ui_IconBrowserContent.onSelectCallback(filteredIconList[icon.index], icon);
+ end
+end
+
+local function onIconClose()
+ hidePopups();
+ if ui_IconBrowserContent.onCancelCallback then
+ ui_IconBrowserContent.onCancelCallback();
+ end
+end
+
+local function filteredIconBrowser()
+ local filter = TRP3_IconBrowserFilterBox:GetText();
+ filteredIconList = getIconList(filter);
+ TRP3_IconBrowserTotal:SetText( (#filteredIconList) .. " / " .. getIconListSize() );
+ initList(
+ {
+ widgetTab = iconWidgetTab,
+ decorate = decorateIcon
+ },
+ filteredIconList,
+ TRP3_IconBrowserContentSlider
+ );
+end
+
+local function initIconBrowser()
+ handleMouseWheel(ui_IconBrowserContent, TRP3_IconBrowserContentSlider);
+ TRP3_IconBrowserContentSlider:SetValue(0);
+ -- Create icons
+ local row, column;
+
+ for row = 0, 5 do
+ for column = 0, 7 do
+ local button = CreateFrame("Button", "TRP3_IconBrowserButton_"..row.."_"..column, ui_IconBrowserContent, "TRP3_IconBrowserButton");
+ button:ClearAllPoints();
+ button:SetPoint("TOPLEFT", ui_IconBrowserContent, "TOPLEFT", 15 + (column * 45), -15 + (row * (-45)));
+ button:SetScript("OnClick", onIconClick);
+ tinsert(iconWidgetTab, button);
+ end
+ end
+
+ TRP3_IconBrowserFilterBox:SetScript("OnTextChanged", filteredIconBrowser);
+ TRP3_IconBrowserClose:SetScript("OnClick", onIconClose);
+
+ setTooltipForSameFrame(TRP3_IconBrowserFilterHelp, "BOTTOMLEFT", 0, 0,
+ "|TInterface\\TUTORIALFRAME\\UI-TutorialFrame-GloveCursor:40|t " .. loc("UI_ICON_BROWSER_HELP") ,loc("UI_ICON_BROWSER_HELP_TT"));
+
+ TRP3_IconBrowserTitle:SetText(loc("UI_ICON_BROWSER"));
+ TRP3_IconBrowserFilterBoxText:SetText(loc("UI_FILTER"));
+ filteredIconBrowser();
+
+ -- Icon from item
+ hooksecurefunc("HandleModifiedItemClick", function(link)
+ if TRP3_IconBrowser:IsVisible() and IsControlKeyDown() and link and GetItemIcon(link) then
+ local icon = GetItemIcon(link):match("([^\\]+)$");
+ TRP3_IconBrowserFilterBox:SetText(icon);
+ TRP3_IconBrowserFilterBox:HighlightText();
+ end
+ end);
+ -- Icon from spellbook
+ local GetSpellBookItemTexture, SpellBook_GetSpellBookSlot, SpellBookFrame = GetSpellBookItemTexture, SpellBook_GetSpellBookSlot, SpellBookFrame;
+ hooksecurefunc("SpellButton_OnModifiedClick", function(self)
+ if TRP3_IconBrowser:IsVisible() and IsControlKeyDown() then
+ local icon = GetSpellBookItemTexture(SpellBook_GetSpellBookSlot(self), SpellBookFrame.bookType):match("([^\\]+)$");
+ TRP3_IconBrowserFilterBox:SetText(icon);
+ TRP3_IconBrowserFilterBox:HighlightText();
+ end
+ end);
+end
+
+function TRP3_API.popup.showIconBrowser(onSelectCallback, onCancelCallback)
+ ui_IconBrowserContent.onSelectCallback = onSelectCallback;
+ ui_IconBrowserContent.onCancelCallback = onCancelCallback;
+ TRP3_IconBrowserFilterBox:SetText("");
+ showPopup(TRP3_IconBrowser);
+ TRP3_IconBrowserFilterBox:SetFocus();
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Companion browser
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local TRP3_CompanionBrowser = TRP3_CompanionBrowser;
+local companionWidgetTab = {};
+local filteredCompanionList = {};
+local ui_CompanionBrowserContent = TRP3_CompanionBrowserContent;
+local GetNumPets, GetPetInfoByIndex = C_PetJournal.GetNumPets, C_PetJournal.GetPetInfoByIndex;
+local GetNumMounts, GetMountInfo = C_MountJournal.GetNumMounts, C_MountJournal.GetMountInfo;
+local currentCompanionType;
+
+local function onCompanionClick(button)
+ hidePopups();
+ if ui_CompanionBrowserContent.onSelectCallback then
+ ui_CompanionBrowserContent.onSelectCallback(filteredCompanionList[button.index], currentCompanionType, button);
+ end
+end
+
+local function onCompanionClose()
+ hidePopups();
+ if ui_CompanionBrowserContent.onCancelCallback then
+ ui_CompanionBrowserContent.onCancelCallback();
+ end
+end
+
+local function decorateCompanion(button, index)
+ local name, icon = filteredCompanionList[index][1], filteredCompanionList[index][2];
+ local description, speciesName = filteredCompanionList[index][3], filteredCompanionList[index][4];
+ button:SetNormalTexture(icon);
+ button:SetPushedTexture(icon);
+ local text = "|cffffff00" .. speciesName .. "|r";
+ if description and description:len() > 0 then
+ text = text .. "\n\"" .. description .. "\"";
+ end
+ setTooltipForFrame(button, TRP3_CompanionBrowser, "RIGHT", 0, -100,
+ "|T" .. icon .. ":40|t " .. name, text);
+ button.index = index;
+end
+
+local function nameComparator(elem1, elem2)
+ return elem1[1] < elem2[1];
+end
+
+local function getWoWCompanionFilteredList(filter)
+ local count = 0;
+ wipe(filteredCompanionList);
+
+ if currentCompanionType == TRP3_API.ui.misc.TYPE_BATTLE_PET then
+ -- Battle pets
+ local numPets, numOwned = GetNumPets();
+ for i = 1, numPets do
+ local petID, speciesID, owned, customName, level, favorite, isRevoked, speciesName, icon, petType, companionID, tooltip, description = GetPetInfoByIndex(i);
+ -- Only renamed pets can be bound
+ if customName and (filter:len() == 0 or customName:find(filter)) then
+ tinsert(filteredCompanionList, {customName, icon, description, speciesName});
+ count = count + 1;
+ end
+ end
+ elseif currentCompanionType == TRP3_API.ui.misc.TYPE_MOUNT then
+ -- Mounts
+ local num, numOwned = GetNumMounts();
+ for i = 1, num do
+ local creatureName, spellID, icon, active, _, _, _, _, _, _, isCollected = GetMountInfo(i);
+ if isCollected and creatureName and (filter:len() == 0 or creatureName:find(filter)) then
+ tinsert(filteredCompanionList, {creatureName, icon, "", loc("PR_CO_MOUNT"), spellID});
+ count = count + 1;
+ end
+ end
+ end
+
+ table.sort(filteredCompanionList, nameComparator);
+
+ return count;
+end
+
+local function filteredCompanionBrowser()
+ local filter = TRP3_CompanionBrowserFilterBox:GetText();
+ local totalCompanionCount = getWoWCompanionFilteredList(filter);
+ TRP3_CompanionBrowserTotal:SetText( (#filteredCompanionList) .. " / " .. totalCompanionCount );
+ initList(
+ {
+ widgetTab = companionWidgetTab,
+ decorate = decorateCompanion
+ },
+ filteredCompanionList,
+ TRP3_CompanionBrowserContentSlider
+ );
+end
+
+local function initCompanionBrowser()
+ handleMouseWheel(ui_CompanionBrowserContent, TRP3_CompanionBrowserContentSlider);
+ TRP3_CompanionBrowserContentSlider:SetValue(0);
+ -- Create icons
+ local row, column;
+
+ for row = 0, 5 do
+ for column = 0, 7 do
+ local button = CreateFrame("Button", "TRP3_CompanionBrowserButton_"..row.."_"..column, ui_CompanionBrowserContent, "TRP3_IconBrowserButton");
+ button:ClearAllPoints();
+ button:SetPoint("TOPLEFT", ui_CompanionBrowserContent, "TOPLEFT", 15 + (column * 45), -15 + (row * (-45)));
+ button:SetScript("OnClick", onCompanionClick);
+ tinsert(companionWidgetTab, button);
+ end
+ end
+
+ TRP3_CompanionBrowserFilterBox:SetScript("OnTextChanged", filteredCompanionBrowser);
+ TRP3_CompanionBrowserClose:SetScript("OnClick", onCompanionClose);
+ setTooltipForSameFrame(TRP3_CompanionBrowserFilterHelp, "TOPLEFT", 0, 0,
+ "|TInterface\\ICONS\\icon_petfamily_beast:25|t " .. loc("UI_COMPANION_BROWSER_HELP") ,loc("UI_COMPANION_BROWSER_HELP_TT"));
+
+ TRP3_CompanionBrowserFilterBoxText:SetText(loc("UI_FILTER"));
+end
+
+function TRP3_API.popup.showCompanionBrowser(onSelectCallback, onCancelCallback, companionType)
+ currentCompanionType = companionType or TRP3_API.ui.misc.TYPE_BATTLE_PET;
+ if currentCompanionType == TRP3_API.ui.misc.TYPE_BATTLE_PET then
+ TRP3_CompanionBrowserTitle:SetText(loc("REG_COMPANION_BROWSER_BATTLE"));
+ TRP3_CompanionBrowserFilterHelp:Show();
+ TRP3_RefreshTooltipForFrame(TRP3_CompanionBrowserFilterHelp);
+ else
+ TRP3_CompanionBrowserTitle:SetText(loc("REG_COMPANION_BROWSER_MOUNT"));
+ TRP3_CompanionBrowserFilterHelp:Hide();
+ end
+ ui_CompanionBrowserContent.onSelectCallback = onSelectCallback;
+ ui_CompanionBrowserContent.onCancelCallback = onCancelCallback;
+ TRP3_CompanionBrowserFilterBox:SetText("");
+ filteredCompanionBrowser();
+ showPopup(TRP3_CompanionBrowser);
+ TRP3_CompanionBrowserFilterBox:SetFocus();
+
+ if currentCompanionType == TRP3_API.ui.misc.TYPE_BATTLE_PET then
+ TRP3_RefreshTooltipForFrame(TRP3_CompanionBrowserFilterHelp);
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Color browser
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local TRP3_ColorBrowser, TRP3_ColorBrowserColor = TRP3_ColorBrowser, TRP3_ColorBrowserColor;
+local toast = TRP3_API.ui.tooltip.toast;
+
+local function initColorBrowser()
+ TRP3_ColorBrowserSelect:SetText(loc("UI_COLOR_BROWSER_SELECT"));
+ TRP3_ColorBrowserTitle:SetText(loc("UI_COLOR_BROWSER"));
+
+ TRP3_ColorBrowserEditBoxText:SetText("Code");
+ setTooltipForSameFrame(TRP3_ColorBrowserEditBoxHelp, "RIGHT", 0, 5, loc("BW_COLOR_CODE"), loc("BW_COLOR_CODE_TT"));
+
+ TRP3_ColorBrowserEditBox:SetScript("OnEnterPressed", function(self)
+ if self:GetText():match("^%x%x%x%x%x%x$") then -- Checks that it is a 6 figures hexadecimal number
+ local r, g, b = hexaToNumber(self:GetText());
+ TRP3_ColorBrowserColor:SetColorRGB(r / 255, g / 255, b / 255);
+ self:ClearFocus();
+ else
+ toast(loc("BW_COLOR_CODE_ALERT"), 1);
+ end
+ end);
+
+ TRP3_ColorBrowserColor:SetScript("OnColorSelect", function(self, r, g, b)
+ TRP3_ColorBrowserSwatch:SetTexture(r, g, b);
+ TRP3_ColorBrowser.red = r;
+ TRP3_ColorBrowser.green = g;
+ TRP3_ColorBrowser.blue = b;
+ TRP3_ColorBrowserEditBox:SetText(("%.2x%.2x%.2x"):format(r * 255, g * 255, b * 255));
+ end);
+
+ TRP3_ColorBrowserSelect:SetScript("OnClick", function()
+ hidePopups();
+ if TRP3_ColorBrowser.callback ~= nil then
+ TRP3_ColorBrowser.callback(TRP3_ColorBrowser.red * 255, TRP3_ColorBrowser.green * 255, TRP3_ColorBrowser.blue * 255);
+ end
+ end);
+end
+
+function TRP3_API.popup.showColorBrowser(callback, red, green, blue)
+ TRP3_ColorBrowserColor:SetColorRGB((red or 255) / 255, (green or 255) / 255, (blue or 255) / 255);
+ TRP3_ColorBrowser.callback = callback;
+ showPopup(TRP3_ColorBrowser);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Image browser
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local imageWidgetTab = {};
+local filteredImageList = {};
+
+local function onImageSelect()
+ assert(TRP3_ImageBrowserContent.currentImage, "No current image ...");
+ hidePopups();
+ if TRP3_ImageBrowser.callback then
+ TRP3_ImageBrowser.callback(filteredImageList[TRP3_ImageBrowserContent.currentImage]);
+ end
+end
+
+local function decorateImage(texture, index)
+ local image = filteredImageList[index];
+ local ratio = image.height / image.width;
+ texture:SetHeight(texture:GetWidth() * ratio);
+ texture:SetTexture(image.url);
+ TRP3_ImageBrowserContentURL:SetText(image.url:sub(11));
+ TRP3_ImageBrowserContent.currentImage = index;
+end
+
+local function filteredImageBrowser()
+ -- TRP3_ImageBrowserContentTexture
+ local filter = TRP3_ImageBrowserFilterBox:GetText();
+ filteredImageList = getImageList(filter);
+ local size = #filteredImageList;
+ TRP3_ImageBrowserTotal:SetText( size .. " / " .. getImageListSize() );
+ if size > 0 then
+ TRP3_ImageBrowserSelect:Enable();
+ else
+ TRP3_ImageBrowserSelect:Disable();
+ end
+ initList(
+ {
+ widgetTab = imageWidgetTab,
+ decorate = decorateImage
+ },
+ filteredImageList,
+ TRP3_ImageBrowserContentSlider
+ );
+end
+
+local function initImageBrowser()
+ handleMouseWheel(TRP3_ImageBrowserContent, TRP3_ImageBrowserContentSlider);
+ TRP3_ImageBrowserContentSlider:SetValue(0);
+ TRP3_ImageBrowserFilterBox:SetScript("OnTextChanged", filteredImageBrowser);
+ TRP3_ImageBrowserSelect:SetScript("OnClick", onImageSelect);
+
+ tinsert(imageWidgetTab, TRP3_ImageBrowserContentTexture);
+
+ TRP3_ImageBrowserTitle:SetText(loc("UI_IMAGE_BROWSER"));
+ TRP3_ImageBrowserFilterBoxText:SetText(loc("UI_FILTER"));
+ TRP3_ImageBrowserSelect:SetText(loc("UI_IMAGE_SELECT"));
+ filteredImageBrowser();
+end
+
+function TRP3_API.popup.showImageBrowser(callback)
+ TRP3_ImageBrowser.callback = callback;
+ showPopup(TRP3_ImageBrowser);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- INIT
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.popup.init()
+ getIconList, getIconListSize = TRP3_API.utils.resources.getIconList, TRP3_API.utils.resources.getIconListSize;
+ getImageList, getImageListSize = TRP3_API.utils.resources.getImageList, TRP3_API.utils.resources.getImageListSize;
+ getMusicList, getMusicListSize = TRP3_API.utils.resources.getMusicList, TRP3_API.utils.resources.getMusicListSize;
+
+ initIconBrowser();
+ initCompanionBrowser();
+ initMusicBrowser();
+ initColorBrowser();
+ initImageBrowser();
+end
diff --git a/totalRP3/tags/0.2.7/core/impl/profiles.lua b/totalRP3/tags/0.2.7/core/impl/profiles.lua
new file mode 100644
index 000000000..fdb84c3ce
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/profiles.lua
@@ -0,0 +1,466 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Player profiles API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- Public accessor
+TRP3_API.profile = {};
+
+-- imports
+local Globals, Events, Utils = TRP3_API.globals, TRP3_API.events, TRP3_API.utils;
+local loc = TRP3_API.locale.getText;
+local unitIDToInfo = Utils.str.unitIDToInfo;
+local strsplit, tinsert, pairs, type, assert, _G, table, tostring, error, wipe = strsplit, tinsert, pairs, type, assert, _G, table, tostring, error, wipe;
+local displayMessage = Utils.message.displayMessage;
+local displayDropDown = TRP3_API.ui.listbox.displayDropDown;
+local handleMouseWheel = TRP3_API.ui.list.handleMouseWheel;
+local initList = TRP3_API.ui.list.initList;
+local setTooltipForSameFrame = TRP3_API.ui.tooltip.setTooltipForSameFrame;
+local setTooltipAll = TRP3_API.ui.tooltip.setTooltipAll;
+local registerMenu, registerPage = TRP3_API.navigation.menu.registerMenu, TRP3_API.navigation.page.registerPage;
+local registerPage, setPage = TRP3_API.navigation.page.registerPage, TRP3_API.navigation.page.setPage;
+local setupIconButton = TRP3_API.ui.frame.setupIconButton;
+local playUISound = TRP3_API.ui.misc.playUISound;
+local playAnimation = TRP3_API.ui.misc.playAnimation;
+local getPlayerCurrentProfile;
+
+-- Saved variables references
+local profiles, character, characters;
+
+local PATH_DELIMITER = "/";
+local currentProfile, currentProfileId;
+local PR_DEFAULT_PROFILE = {
+ player = {},
+};
+
+-- Return the default profile.
+-- Note that this profile is never directly linked to a character, only duplicated !
+TRP3_API.profile.getDefaultProfile = function()
+ return PR_DEFAULT_PROFILE;
+end
+
+-- Get data from a profile in a XPATH way.
+-- Example : "player/misc/PE" is equivalent to currentProfile.player.misc.PE but in a nil safe way.
+-- Use currentProfile if profileRef is nil
+local function getData(fieldPath, profileRef)
+ assert(fieldPath, "Error: Fieldpath is nil.");
+ local split = {strsplit(PATH_DELIMITER, fieldPath)};
+ local pathPart = #split;
+ local ref = profileRef or getPlayerCurrentProfile();
+ for index, path in pairs(split) do
+ if index == pathPart then -- Last
+ return ref[path];
+ end
+ ref = ref[path];
+ if type(ref) ~= "table" then
+ return nil;
+ end
+ end
+end
+TRP3_API.profile.getData = getData;
+
+-- Get data from a profile in a XPATH way.
+-- Example : "player/misc/PE" is equivalent to currentProfile.player.misc.PE but in a nil safe way.
+-- Use currentProfile. If value is nil, return the ifNilValue.
+local function getDataDefault(fieldPath, ifNilValue, profileRef)
+ return getData(fieldPath, profileRef) or ifNilValue;
+end
+TRP3_API.profile.getDataDefault = getDataDefault;
+
+local function getProfiles()
+ return profiles;
+end
+TRP3_API.profile.getProfiles = getProfiles;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Logic
+-- For decoupling reasons, the saved variables TRP3_Profiles and TRP3_Characters should'nt be used outside this file !
+-- You should use all the public methods instead.
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Check if the profileName is not already used
+local function isProfileNameAvailable(profileName)
+ for profileID, profile in pairs(profiles) do
+ if profile.profileName == profileName then
+ return false, profileID;
+ end
+ end
+ return true;
+end
+TRP3_API.profile.isProfileNameAvailable = isProfileNameAvailable;
+
+-- Duplicate an existing profile
+local function duplicateProfile(duplicatedProfile, profileName)
+ assert(duplicatedProfile, "Nil profile");
+ assert(isProfileNameAvailable(profileName), "Unavailable profile name: "..tostring(profileName));
+ local profileID = Utils.str.id();
+ profiles[profileID] = {};
+ Utils.table.copy(profiles[profileID], duplicatedProfile);
+ profiles[profileID].profileName = profileName;
+ displayMessage(loc("PR_PROFILE_CREATED"):format(Utils.str.color("g")..profileName.."|r"));
+ return profileID;
+end
+TRP3_API.profile.duplicateProfile = duplicateProfile;
+
+-- Creating a new profile using PR_DEFAULT_PROFILE as a template
+local function createProfile(profileName)
+ return duplicateProfile(PR_DEFAULT_PROFILE, profileName);
+end
+
+-- Just internally switch the current profile structure. That's all.
+local function selectProfile(profileID)
+ if not profiles[profileID] then
+ error("Unknown profile id: " + profileID);
+ end
+ currentProfile = profiles[profileID];
+ currentProfileId = profileID;
+ character.profileID = profileID;
+ displayMessage(loc("PR_PROFILE_LOADED"):format(Utils.str.color("g")..profiles[character.profileID]["profileName"].."|r"));
+ Events.fireEvent(Events.REGISTER_PROFILES_LOADED, currentProfile);
+ Events.fireEvent(Events.REGISTER_DATA_UPDATED, Globals.player_id, profileID);
+end
+TRP3_API.profile.selectProfile = selectProfile;
+
+-- Edit a profile name
+local function editProfile(profileID, newName)
+ assert(profiles[profileID], "Unknown profile: "..tostring(profileID));
+ assert(isProfileNameAvailable(newName), "Unavailable profile name: "..tostring(newName));
+ profiles[profileID]["profileName"] = newName;
+end
+
+-- Delete a profile
+-- If the deleted profile is the currently selected one, assign the default profile
+local function deleteProfile(profileID)
+ assert(profiles[profileID], "Unknown profile: "..tostring(profileID));
+ assert(currentProfileId ~= profileID, "You can't delete the currently selected profile !");
+ local profileName = profiles[profileID]["profileName"];
+ wipe(profiles[profileID]);
+ profiles[profileID] = nil;
+ displayMessage(loc("PR_PROFILE_DELETED"):format(Utils.str.color("g")..profileName.."|r"));
+end
+
+function TRP3_API.profile.getPlayerCurrentProfileID()
+ return currentProfileId;
+end
+
+function getPlayerCurrentProfile()
+ return currentProfile;
+end
+TRP3_API.profile.getPlayerCurrentProfile = getPlayerCurrentProfile;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- UI
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+local profileListID = {};
+
+local function decorateProfileList(widget, index)
+ local id = profileListID[index];
+ widget.profileID = id;
+ local profile = profiles[id];
+ local dataTab = getData("player/characteristics", profile);
+ local mainText = profile.profileName;
+
+ if id == currentProfileId then
+
+ widget:SetBackdropBorderColor(0, 1, 0);
+ _G[widget:GetName().."Current"]:Show();
+ else
+ widget:SetBackdropBorderColor(1, 1, 1);
+ _G[widget:GetName().."Current"]:Hide();
+ end
+
+ setupIconButton(_G[widget:GetName().."Icon"], dataTab.IC or Globals.icons.profile_default);
+ _G[widget:GetName().."Name"]:SetText(mainText);
+
+ local listText = "";
+ local i = 0;
+ for characterID, characterInfo in pairs(characters) do
+ if characterInfo.profileID == id then
+ local charactName, charactRealm = unitIDToInfo(characterID);
+ listText = listText.."- |cff00ff00"..charactName.." ( "..charactRealm.." )|r\n";
+ i = i + 1;
+ end
+ end
+ _G[widget:GetName().."Count"]:SetText(loc("PR_PROFILEMANAGER_COUNT"):format(i));
+
+ local text = "";
+ if i > 0 then
+ text = text..loc("PR_PROFILE_DETAIL")..":\n"..listText;
+ else
+ text = text..loc("PR_UNUSED_PROFILE");
+ end
+
+ setTooltipForSameFrame(_G[widget:GetName().."Info"], "RIGHT", 0, 0, loc("PR_PROFILE"), text);
+end
+
+local function profileSortingByProfileName(profileID1, profileID2)
+ return profiles[profileID1].profileName < profiles[profileID2].profileName;
+end
+
+-- Refresh list display
+local function uiInitProfileList()
+ wipe(profileListID);
+ for profileID, _ in pairs(profiles) do
+ tinsert(profileListID, profileID);
+ end
+ table.sort(profileListID, profileSortingByProfileName);
+ initList(TRP3_ProfileManagerList, profileListID, TRP3_ProfileManagerListSlider);
+end
+
+local showAlertPopup, showTextInputPopup, showConfirmPopup = TRP3_API.popup.showAlertPopup, TRP3_API.popup.showTextInputPopup, TRP3_API.popup.showConfirmPopup;
+
+local function uiCheckNameAvailability(profileName)
+ if not isProfileNameAvailable(profileName) then
+ TRP3_API.ui.tooltip.toast(loc("PR_PROFILEMANAGER_ALREADY_IN_USE"):format(Utils.str.color("r")..profileName.."|r"), 3);
+ return false;
+ end
+ return true;
+end
+
+local function uiCreateProfile()
+ showTextInputPopup(loc("PR_PROFILEMANAGER_CREATE_POPUP"),
+ function(newName)
+ if newName and #newName ~= 0 then
+ if not uiCheckNameAvailability(newName) then return end
+ createProfile(newName);
+ uiInitProfileList();
+ end
+ end,
+ nil,
+ Globals.player_realm .. " - " .. Globals.player
+ );
+end
+
+-- Promps profile delete confirmation
+local function uiDeleteProfile(profileID)
+ showConfirmPopup(loc("PR_PROFILEMANAGER_DELETE_WARNING"):format(Utils.str.color("g")..profiles[profileID].profileName.."|r"),
+ function()
+ deleteProfile(profileID);
+ uiInitProfileList();
+ end);
+end
+
+local function uiEditProfile(profileID)
+ showTextInputPopup(
+ loc("PR_PROFILEMANAGER_EDIT_POPUP"):format(Utils.str.color("g")..profiles[profileID].profileName.."|r"),
+ function(newName)
+ if newName and #newName ~= 0 then
+ if not uiCheckNameAvailability(newName) then return end
+ editProfile(profileID, newName);
+ uiInitProfileList();
+ end
+ end,
+ nil,
+ profiles[profileID].profileName
+ );
+end
+
+local function uiSelectProfile(profileID)
+ if character.profileID == profileID then
+ return;
+ end
+ selectProfile(profileID);
+ uiInitProfileList();
+end
+
+local function uiDuplicateProfile(profileID)
+ showTextInputPopup(
+ loc("PR_PROFILEMANAGER_DUPP_POPUP"):format(Utils.str.color("g")..profiles[profileID].profileName.."|r"),
+ function(newName)
+ if newName and #newName ~= 0 then
+ if not uiCheckNameAvailability(newName) then return end
+ duplicateProfile(profiles[profileID], newName);
+ uiInitProfileList();
+ end
+ end,
+ nil,
+ profiles[profileID].profileName
+ );
+end
+
+local function onProfileSelected(button)
+ local profileID = button.profileID;
+ playAnimation(_G[button:GetName() .. "HighlightAnimate"]);
+ playAnimation(_G[button:GetName() .. "Animate"]);
+ uiSelectProfile(profileID);
+end
+
+local function onActionSelected(value, button)
+ local profileID = button:GetParent().profileID;
+
+ if value == 1 then
+ uiDeleteProfile(profileID);
+ elseif value == 2 then
+ uiEditProfile(profileID);
+ elseif value == 3 then
+ uiDuplicateProfile(profileID);
+ end
+end
+
+local function onActionClicked(button)
+ local profileID = button:GetParent().profileID;
+ local values = {};
+ tinsert(values, {loc("PR_PROFILEMANAGER_RENAME"), 2});
+ tinsert(values, {loc("PR_DUPLICATE_PROFILE"), 3});
+ if currentProfileId ~= profileID then
+ tinsert(values, {loc("PR_DELETE_PROFILE"), 1});
+ else
+ tinsert(values, {"|cff999999" .. loc("PR_DELETE_PROFILE"), nil});
+ end
+ displayDropDown(button, values, onActionSelected, 0, true);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Character
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.profile.getPlayerCharacter()
+ return character;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- INIT
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Tutorial
+local TUTORIAL_STRUCTURE;
+
+local function createTutorialStructure()
+ TUTORIAL_STRUCTURE = {
+ {
+ box = {
+ allPoints = TRP3_ProfileManagerList
+ },
+ button = {
+ x = 0, y = -110, anchor = "CENTER",
+ text = loc("PR_PROFILE_HELP"),
+ textWidth = 400,
+ arrow = "UP"
+ }
+ }
+ }
+end
+
+
+function TRP3_API.profile.init()
+ createTutorialStructure();
+
+ -- Saved structures
+ if not TRP3_Profiles then
+ TRP3_Profiles = {};
+ end
+ profiles = TRP3_Profiles;
+ if not TRP3_Characters then
+ TRP3_Characters = {};
+ end
+ characters = TRP3_Characters;
+
+ if not characters[Globals.player_id] then
+ characters[Globals.player_id] = {};
+ end
+ character = characters[Globals.player_id];
+
+ -- First time this character is connected with TRP3 or if deleted profile through another character
+ -- So we create a new profile named by his pseudo.
+ if not character.profileID or not profiles[character.profileID] then
+ -- Detect if a profile with name - realm already exists
+ local available, profileID = isProfileNameAvailable(Globals.player_realm .. " - " .. Globals.player);
+ if not available and profileID then
+ selectProfile(profileID);
+ else
+ selectProfile(createProfile(Globals.player_realm .. " - " .. Globals.player));
+ end
+ else
+ selectProfile(character.profileID);
+ end
+
+ -- UI
+ local tabGroup; -- Reference to the tab panel tabs group
+ handleMouseWheel(TRP3_ProfileManagerList, TRP3_ProfileManagerListSlider);
+ TRP3_ProfileManagerListSlider:SetValue(0);
+ local widgetTab = {};
+ for i=1,5 do
+ local widget = _G["TRP3_ProfileManagerListLine"..i];
+ widget:SetScript("OnMouseUp",function (self)
+ if currentProfileId ~= self.profileID then
+ onProfileSelected(widget);
+ playAnimation(_G[self:GetName() .. "HighlightAnimate"]);
+ playAnimation(_G[self:GetName() .. "Animate"]);
+ playUISound("gsCharacterSelection");
+ end
+ end);
+ _G[widget:GetName().."Action"]:SetScript("OnClick", onActionClicked);
+ _G[widget:GetName().."Current"]:SetText(loc("PR_PROFILEMANAGER_CURRENT"));
+ setTooltipAll(_G[widget:GetName().."Action"], "TOP", 0, 0, loc("PR_PROFILEMANAGER_ACTIONS"));
+ table.insert(widgetTab, widget);
+
+ end
+ TRP3_ProfileManagerList.widgetTab = widgetTab;
+ TRP3_ProfileManagerList.decorate = decorateProfileList;
+ TRP3_ProfileManagerAdd:SetScript("OnClick", uiCreateProfile);
+
+ --Localization
+ TRP3_ProfileManagerAdd:SetText(loc("PR_CREATE_PROFILE"));
+
+ registerPage({
+ id = "player_profiles",
+ frame = TRP3_ProfileManager,
+ onPagePostShow = function()
+ tabGroup:SelectTab(1);
+ if TRP3_API.importer.charactersProfilesAvailable() then
+ tabGroup:SetTabVisible(2, true);
+ else
+ tabGroup:SetTabVisible(2, false);
+ end
+ end,
+ tutorialProvider = function() return TUTORIAL_STRUCTURE; end,
+ });
+
+ local frame = CreateFrame("Frame", "TRP3_ProfileManagerTabBar", TRP3_ProfileManager);
+ frame:SetSize(400, 30);
+ frame:SetPoint("TOPLEFT", 17, -5);
+ frame:SetFrameLevel(1);
+
+ tabGroup = TRP3_API.ui.frame.createTabPanel(frame,
+ {
+ {loc("PR_PROFILEMANAGER_TITLE"), 1, 175},
+ {loc("PR_IMPORT_CHAR_TAB"), 2, 175},
+ },
+ function(tabWidget, value)
+ local list, importer = TRP3_ProfileManager:GetChildren();
+ importer:Hide();
+ list:Hide();
+ if value == 1 then
+ list:Show();
+ uiInitProfileList();
+ elseif value == 2 then
+ importer:Show();
+ end
+ end
+ );
+ tabGroup:SelectTab(1);
+
+ local getCurrentPageID = TRP3_API.navigation.page.getCurrentPageID;
+
+ Events.listenToEvent(Events.REGISTER_PROFILES_LOADED, function()
+ if getCurrentPageID() == "player_profiles" then
+ if tabGroup.current == 1 then
+ tabGroup:SelectTab(1); -- Force refresh
+ end
+ end
+ end);
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/script/script_effects.lua b/totalRP3/tags/0.2.7/core/impl/script/script_effects.lua
new file mode 100644
index 000000000..4c03d362c
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/script/script_effects.lua
@@ -0,0 +1,44 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Scripts : Effects
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local assert, type, tostring, error, tonumber, pairs, unpack, wipe = assert, type, tostring, error, tonumber, pairs, unpack, wipe;
+
+local EFFECTS = {
+ ["text"] = {
+ codeReplacement= "print(\"%s\");",
+ args = 1,
+ env = {
+ print = "print",
+ }
+ },
+}
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Logic
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+TRP3_API.script.registerEffect = function(effect)
+ assert(type(effect) == "table" and effect.id, "Effect must have an id.");
+ assert(not EFFECTS[effect.id], "Already registered effect id: " .. effect.id);
+ EFFECTS[effect.id] = effect;
+end
+
+TRP3_API.script.getEffect = function(effectID)
+ return EFFECTS[effectID];
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/script/script_generation.lua b/totalRP3/tags/0.2.7/core/impl/script/script_generation.lua
new file mode 100644
index 000000000..f2883c2f6
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/script/script_generation.lua
@@ -0,0 +1,455 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Scripts : Code generation
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+TRP3_API.script = {};
+
+local assert, type, tostring, error, tonumber, pairs, unpack, wipe = assert, type, tostring, error, tonumber, pairs, unpack, wipe;
+local tableCopy = TRP3_API.utils.table.copy;
+local writeElement;
+
+local DEBUG = true;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Escape " in string argument, to avoid script injection
+local function escapeArguments(args)
+ local escaped = {};
+ for index, arg in pairs(args) do
+ if type(arg) == "string" then
+ escaped[index] = arg:gsub("\"", "\\\"");
+ else
+ escaped[index] = arg;
+ end
+ end
+ return escaped;
+end
+
+TRP3_API.script.eval = function(conditionValue, conditionID, conditionStorage)
+ if conditionID and conditionValue then
+ conditionStorage[conditionID] = true;
+ end
+ return conditionValue;
+end
+
+TRP3_API.script.delayed = function(delay, func)
+ -- TODO
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Writer
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local CURRENT_CODE, CURRENT_INDENT, CURRENT_STRUCTURE, CURRENT_ENVIRONMENT;
+local INDENT_CHAR = "\t";
+
+local function writeLine(code, onTop)
+ if onTop then
+ CURRENT_CODE = CURRENT_INDENT .. code .. "\n" .. CURRENT_CODE;
+ else
+ CURRENT_CODE = CURRENT_CODE .. CURRENT_INDENT .. code .. "\n";
+ end
+end
+
+local function addIndent()
+ CURRENT_INDENT = CURRENT_INDENT .. INDENT_CHAR;
+end
+
+local function removeIndent()
+ if CURRENT_INDENT:len() > 1 then
+ CURRENT_INDENT = CURRENT_INDENT:sub(1, -2);
+ else
+ CURRENT_INDENT = "";
+ end
+end
+
+local function startIf(content)
+ writeLine(("if %s then"):format(content));
+ addIndent();
+end
+
+local function closeBlock()
+ removeIndent();
+ writeLine("end");
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 1 : Test
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function getTestOperande(id)
+ return TRP3_API.script.getOperand(id);
+end
+
+local function writeOperand(testStructure, comparatorType)
+ local code;
+ assert(testStructure.v or testStructure.i, "No operand info");
+ if testStructure.v then
+ if comparatorType == "number" then
+ assert(tonumber(testStructure.v) ~= nil, "Cannot parse operand value: " .. testStructure.v);
+ code = testStructure.v;
+ else
+ if type(testStructure.v) == "string" then
+ code = "\"" .. testStructure.v .. "\"";
+ elseif type(testStructure.v) == "boolean" then
+ code = tostring(testStructure.v);
+ else
+ error("Unknown operand value type: " .. type(testStructure.v));
+ end
+ end
+ else
+ local args = testStructure.a;
+ local operandInfo = getTestOperande(testStructure.i);
+ assert(operandInfo, "Unknown operand ID: " .. testStructure.i);
+ assert(comparatorType ~= "number" or operandInfo.numeric, "Operand ID is not numeric: " .. testStructure.i);
+
+ local codeReplacement = operandInfo.codeReplacement;
+ if operandInfo.args then -- has arguments
+ assert(args, "Missing arguments for operand: " .. testStructure.i);
+ assert(#args == operandInfo.args, ("Incomplete arguments for %s: %s / %s"):format(testStructure.i, #args, operandInfo.args));
+ codeReplacement = codeReplacement:format(unpack(escapeArguments(args)));
+ end
+ code = codeReplacement;
+
+ -- Register operand environment
+ if operandInfo.env then
+ for map, g in pairs(operandInfo.env) do
+ CURRENT_ENVIRONMENT[map] = g;
+ end
+ end
+ end
+ return code;
+end
+
+local function writeTest(testStructure)
+ assert(testStructure, "testStructure is nil");
+ local comparator, comparatorType;
+
+ -- Comparator
+ assert(testStructure.c, "Comparator is nil");
+ local comparator = tostring(testStructure.c);
+ if comparator == "<" or comparator == ">" or comparator == "<=" or comparator == ">=" then
+ comparatorType = "number";
+ elseif comparator == "==" or comparator == "~=" then
+ comparatorType = "string";
+ else
+ error("Unknown comparator: " .. tostring(comparator));
+ end
+
+ -- Left operande
+ assert(testStructure.l, "No left operand");
+ local left = writeOperand(testStructure.l, comparatorType);
+
+ -- Right operand
+ assert(testStructure.r, "No Right operand");
+ local right = writeOperand(testStructure.r, comparatorType)
+
+ -- Write code
+ return ("%s %s %s"):format(left, comparator, right);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 2 : Condition
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function writeCondition(conditionStructure, conditionID)
+ assert(type(conditionStructure) == "table", "conditionStructure is not a table");
+ local code = "";
+ local previousType;
+ local isInParenthesis = false;
+ for index, element in pairs(conditionStructure) do
+ if type(element) == "string" then
+ assert(index > 1 and index < #conditionStructure, ("Can't have a logic operator at start or end: index %s for operator %s"):format(index, element));
+ assert(previousType ~= "string", "Can't have two successive logic operator");
+ if element == "+" then
+ code = code .. "and" .. " ";
+ elseif element == "*" then
+ code = code .. "or" .. " ";
+ else
+ error("Unknown logic operator: " .. element);
+ end
+ elseif type(element) == "table" then
+ assert(previousType ~= "table", "Can't have two successive tests");
+ if index == #conditionStructure and isInParenthesis then -- End of condition
+ code = code .. writeTest(element) .. " ) ";
+ isInParenthesis = false;
+ elseif index < #conditionStructure then
+ if conditionStructure[index + 1] == "+" and isInParenthesis then
+ code = code .. writeTest(element) .. " ) ";
+ isInParenthesis = false;
+ elseif conditionStructure[index + 1] == "*" and not isInParenthesis then
+ code = code .. "( " .. writeTest(element) .. " ";
+ isInParenthesis = true;
+ else
+ code = code .. writeTest(element) .. " ";
+ end
+ else
+ code = code .. writeTest(element) .. " ";
+ end
+ else
+ error("Unknown condition element: " .. element);
+ end
+ previousType = type(element);
+ end
+
+ if conditionID then
+ code = ("eval(%s, \"%s\", conditionStorage)"):format(code, conditionID);
+ end
+
+ return code;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 3 : Effect
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function getEffectInfo(id)
+ return TRP3_API.script.getEffect(id);
+end
+
+local function writeEffect(effectStructure)
+ assert(type(effectStructure) == "table", "effectStructure is not a table");
+ assert(effectStructure.id, "Effect don't have ID");
+ local effectInfo = getEffectInfo(effectStructure.id);
+ assert(effectInfo, "Unknown effect ID: " .. effectStructure.id);
+
+ -- Register operand environment
+ if effectInfo.env then
+ for map, g in pairs(effectInfo.env) do
+ CURRENT_ENVIRONMENT[map] = g;
+ end
+ end
+
+ local effectCode = effectInfo.codeReplacement;
+ if (effectInfo.args or 0) > 0 then
+ assert(effectStructure.args, "Missing args for effect: " .. effectStructure.id);
+ assert(#effectStructure.args == effectInfo.args, ("Incomplete arguments for %s: %s / %s"):format(effectStructure.id, #effectStructure.args, effectInfo.args));
+ effectCode = effectCode:format(unpack(escapeArguments(effectStructure.args)));
+ end
+
+ if effectStructure.cond and #effectStructure.cond > 0 then
+ startIf(writeCondition(effectStructure.cond, effectStructure.condID));
+ end
+ writeLine(effectCode);
+ if effectStructure.cond and #effectStructure.cond > 0 then
+ closeBlock();
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 4 : Effects list
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function writeEffectList(listStructure)
+ assert(type(listStructure.e) == "table", "listStructure.e is not a table");
+
+ for index, effect in pairs(listStructure.e) do
+ writeEffect(effect);
+ end
+
+ if listStructure.n then
+ writeElement(listStructure.n);
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 4 : Branching
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local BRANCHING_COND = "if %s then";
+
+local function writeBranching(branchStructure)
+ assert(type(branchStructure.b) == "table", "branchStructure.b is not a table");
+ if #branchStructure.b == 0 then return; end
+
+ for index, branch in pairs(branchStructure.b) do
+ if DEBUG then
+ writeLine("-- branch " .. index);
+ end
+ if branch.cond and #branch.cond > 0 then
+ startIf(writeCondition(branch.cond, branch.condID));
+ end
+ writeElement(branch.n);
+ if DEBUG then
+ writeLine("");
+ end
+ if branch.cond and #branch.cond > 0 then
+ closeBlock();
+ end
+ if DEBUG then
+ writeLine("");
+ end
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 4 : Delay
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function writeDelay(delayStructure)
+ assert(type(delayStructure.d) == "number", "listStructure duration is not a number");
+
+ writeLine(("delayed(%s, function() "):format(delayStructure.d));
+ addIndent();
+ if delayStructure.n then
+ writeElement(delayStructure.n);
+ end
+ removeIndent();
+ if DEBUG then
+ writeLine("");
+ end
+ writeLine("end);");
+ if DEBUG then
+ writeLine("");
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LEVEL 5 : Thread
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+writeElement = function(elementID)
+ assert(elementID, "elementID is nil");
+ local element = CURRENT_STRUCTURE[elementID];
+ assert(element, "Unknown element ID: " .. elementID);
+
+ if DEBUG then
+ writeLine("");
+ writeLine("-- Element " .. elementID);
+ end
+
+ if element.t == "list" then
+ writeEffectList(element);
+ elseif element.t == "branch" then
+ writeBranching(element);
+ elseif element.t == "delay" then
+ writeDelay(element);
+ else
+ error("Unknown element type: " .. tostring(element.t));
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Main
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local BASE_ENV = {delayed = "TRP3_API.script.delayed", eval = "TRP3_API.script.eval"};
+local IMPORT_PATTERN = "local %s = %s;";
+
+local function writeImports()
+ for alias, global in pairs(CURRENT_ENVIRONMENT) do
+ writeLine(IMPORT_PATTERN:format(alias, global), true);
+ end
+ if DEBUG then
+ writeLine("-- Imports", true);
+ end
+end
+
+local function generateCode(effectStructure)
+ CURRENT_CODE = "";
+ CURRENT_INDENT = "";
+
+ if not CURRENT_ENVIRONMENT then
+ CURRENT_ENVIRONMENT = {};
+ end
+ wipe(CURRENT_ENVIRONMENT);
+ tableCopy(CURRENT_ENVIRONMENT, BASE_ENV);
+
+ CURRENT_STRUCTURE = effectStructure;
+
+ writeLine("local func = function(...)");
+ addIndent();
+ writeLine("local conditionStorage = {};"); -- Store conditions evaluation
+ writeElement("1"); -- 1 is always the first element
+ if DEBUG then
+ writeLine("return 0, conditionStorage;");
+ else
+ writeLine("return 0;");
+ end
+ closeBlock();
+ writeImports();
+ writeLine("setfenv(func, {});");
+ writeLine("return func;");
+
+ return CURRENT_CODE;
+end
+
+local function generate(effectStructure)
+ local code = generateCode(effectStructure);
+
+ -- Generating factory
+ local func, errorMessage = loadstring(code, "Generated code");
+ if not func then
+ print(errorMessage);
+ return nil, code;
+ end
+
+ return func, code;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- MOCKUP
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local MOCK_STRUCTURE = {
+ -- EFFECT LIST 1
+ ["1"] = {
+ t = "list",
+ e = {
+ -- EFFECT 1
+ {
+ id = "text",
+ condID = 1,
+ cond = {
+ {l = {v = "Telkostrasz",},c = "==",r = {i = "tar_name",}},
+ },
+ args = {
+ "La cible est Telkostrasz",
+ }
+ },
+ -- EFFECT 1
+ {
+ id = "text",
+ cond = {
+ {l = {v = true,},c = "~=",r = {i = "cond", a = {1}}},
+ },
+ args = {
+ "La cible\");print(\"you just got hacked\");print(\"",
+ }
+ }
+ }
+ },
+}
+
+function TRP3_Generate()
+ local functionFactory, code = generate(MOCK_STRUCTURE);
+ TRP3_DEBUG_CODE_FRAME:Show();
+ TRP3_DEBUG_CODE_FRAME_TEXT:SetText(code);
+
+ if functionFactory then
+ local func = functionFactory();
+ local status, ret, conditions = pcall(func);
+ if status then
+ TRP3_API.utils.table.dump(conditions);
+ else
+ print(ret);
+ end
+ end
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/script/script_operands.lua b/totalRP3/tags/0.2.7/core/impl/script/script_operands.lua
new file mode 100644
index 000000000..566653c3c
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/script/script_operands.lua
@@ -0,0 +1,49 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Scripts : Operands
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local assert, type, tostring, error, tonumber, pairs, unpack, wipe = assert, type, tostring, error, tonumber, pairs, unpack, wipe;
+
+local OPERANDS = {
+ ["tar_name"] = {
+ codeReplacement= "tostring(name(\"target\"))",
+ env = {
+ ["name"] = "UnitName",
+ ["tostring"] = "tostring",
+ },
+ },
+
+ ["cond"] = {
+ codeReplacement= "conditionStorage[\"%s\"]",
+ args = 1
+ },
+};
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Logic
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+TRP3_API.script.registerOperand = function(operand)
+ assert(type(operand) == "table" and operand.id, "Operand must have an id.");
+ assert(not OPERANDS[operand.id], "Already registered operand id: " .. operand.id);
+ OPERANDS[operand.id] = operand;
+end
+
+TRP3_API.script.getOperand = function(operandID)
+ return OPERANDS[operandID];
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/slash.lua b/totalRP3/tags/0.2.7/core/impl/slash.lua
new file mode 100644
index 000000000..6c9fee553
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/slash.lua
@@ -0,0 +1,71 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Slash commands
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+local loc = TRP3_API.locale.getText;
+local displayMessage = TRP3_API.utils.message.displayMessage;
+local _G, tonumber, math, tinsert, type, assert, tostring, pairs, sort, strconcat = _G, tonumber, math, tinsert, type, assert, tostring, pairs, table.sort, strconcat;
+
+TRP3_API.slash = {}
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Command management
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local COMMANDS = {};
+
+function TRP3_API.slash.registerCommand(commandStructure)
+ assert(commandStructure and commandStructure.id, "Command structure must have and id.");
+ assert(commandStructure.id ~= "help", "The command id \"help\" is reserved.");
+ assert(not COMMANDS[commandStructure.id], "Already registered command id: " .. tostring(commandStructure.id));
+ COMMANDS[commandStructure.id] = commandStructure;
+end
+
+function TRP3_API.slash.unregisterCommand(commandID)
+ COMMANDS[commandID] = nil;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Command handling
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+SLASH_TOTALRP31, SLASH_TOTALRP32 = '/trp3', '/totalrp3';
+local sortTable = {};
+
+function SlashCmdList.TOTALRP3(msg, editbox)
+ local cmdID, arg1, arg2, arg3, arg4, arg5, arg6 = strsplit(" ", msg);
+
+ if cmdID and COMMANDS[cmdID] and COMMANDS[cmdID].handler then
+ COMMANDS[cmdID].handler(arg1, arg2, arg3, arg4, arg5, arg6);
+ else
+ -- Show command list
+ displayMessage(loc("COM_LIST"));
+ wipe(sortTable);
+ for cmdID, _ in pairs(COMMANDS) do
+ tinsert(sortTable, cmdID);
+ end
+ sort(sortTable);
+ for _, cmdID in pairs(sortTable) do
+ local cmd, cmdText = COMMANDS[cmdID], "|cff00ff00/trp3 " .. cmdID .. "|r|cffff9900";
+ if cmd.helpLine then
+ cmdText = cmdText .. cmd.helpLine;
+ end
+ displayMessage(cmdText);
+ end
+ end
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/ui_main.lua b/totalRP3/tags/0.2.7/core/impl/ui_main.lua
new file mode 100644
index 000000000..5dca3272b
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/ui_main.lua
@@ -0,0 +1,145 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Main UI API and Widgets API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+-- Copyright 2014 Renaud Parize (Ellypse) (renaud@parize.me)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Minimap button widget
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Config
+local displayMessage = TRP3_API.utils.message.displayMessage;
+local CONFIG_MINIMAP_SHOW = "minimap_show";
+local CONFIG_MINIMAP_POSITION = "minimap_icon_position";
+local getConfigValue, registerConfigKey = TRP3_API.configuration.getValue, TRP3_API.configuration.registerConfigKey;
+local color, loc, strconcat = TRP3_API.utils.str.color, TRP3_API.locale.getText, strconcat;
+
+-- Minimap button API initialization
+TRP3_API.navigation.minimapicon = {};
+
+local LDBObject;
+local icon;
+
+-- Initialize LDBIcon and display the minimap button
+local showMinimapButton = function()
+ icon:Show("Total RP 3");
+end
+TRP3_API.navigation.minimapicon.show = showMinimapButton;
+
+-- Hide the minimap button and release LDBIcon from the memory
+local hideMinimapButton = function()
+ icon:Hide("Total RP 3");
+end
+TRP3_API.navigation.minimapicon.hide = hideMinimapButton;
+
+TRP3_API.events.listenToEvent(TRP3_API.events.WORKFLOW_ON_LOADED, function()
+
+
+ registerConfigKey(CONFIG_MINIMAP_SHOW, true);
+ registerConfigKey(CONFIG_MINIMAP_POSITION, {});
+
+ -- Build configuration page
+ tinsert(TRP3_API.configuration.CONFIG_FRAME_PAGE.elements, {
+ inherit = "TRP3_ConfigH1",
+ title = loc("CO_MINIMAP_BUTTON"),
+ });
+ tinsert(TRP3_API.configuration.CONFIG_FRAME_PAGE.elements, {
+ inherit = "TRP3_ConfigCheck",
+ title = loc("CO_MINIMAP_BUTTON_SHOW_TITLE"),
+ help = loc("CO_MINIMAP_BUTTON_SHOW_HELP"),
+ configKey = CONFIG_MINIMAP_SHOW,
+ });
+
+ TRP3_API.configuration.registerHandler(CONFIG_MINIMAP_SHOW, function()
+ if getConfigValue(CONFIG_MINIMAP_SHOW) then
+ showMinimapButton();
+ else
+ hideMinimapButton();
+ end
+ end);
+
+ local minimapTooltip = strconcat(color("y"), loc("CM_L_CLICK"), ": ", color("w"), loc("MM_SHOW_HIDE_MAIN"));
+ if TRP3_API.toolbar then
+ minimapTooltip = strconcat(minimapTooltip, "\n", color("y"), loc("CM_R_CLICK"), ": ", color("w"), loc("MM_SHOW_HIDE_SHORTCUT"));
+ end
+ minimapTooltip = strconcat(minimapTooltip, "\n", color("y"), loc("CM_DRAGDROP"), ": ", color("w"), loc("MM_SHOW_HIDE_MOVE"));
+
+ LDBObject = LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("Total RP 3", {
+ type = "launcher",
+ icon = "Interface\\AddOns\\totalRP3\\resources\\trp3minimap.tga",
+ tocname = "totalRP3",
+ OnClick = function(clickedframe, button)
+ if button == "RightButton" and TRP3_API.toolbar then
+ TRP3_API.toolbar.switch();
+ else
+ TRP3_API.navigation.switchMainFrame();
+ end
+ end,
+ OnTooltipShow = function(tooltip)
+ tooltip:AddLine("Total RP 3");
+ tooltip:AddLine(minimapTooltip);
+ end,
+ })
+
+ icon = LibStub("LibDBIcon-1.0");
+ local configKey = getConfigValue(CONFIG_MINIMAP_POSITION);
+ configKey.hide = not getConfigValue(CONFIG_MINIMAP_SHOW);
+ icon:Register("Total RP 3", LDBObject, getConfigValue(CONFIG_MINIMAP_POSITION));
+
+ -- Slash command to switch frames
+ TRP3_API.slash.registerCommand({
+ id = "switch",
+ helpLine = " main || toolbar",
+ handler = function(arg1)
+ if arg1 ~= "main" and arg1 ~= "toolbar" then
+ displayMessage(loc("COM_SWITCH_USAGE"));
+ elseif arg1 == "main" then
+ TRP3_API.navigation.switchMainFrame();
+ else
+ if TRP3_API.toolbar then
+ TRP3_API.toolbar.switch();
+ end
+ end
+ end
+ });
+
+ -- Slash command to reset frames
+ TRP3_API.slash.registerCommand({
+ id = "reset",
+ helpLine = " frames",
+ handler = function(arg1)
+ if arg1 ~= "frames" then
+ displayMessage(loc("COM_RESET_USAGE"));
+ else
+ -- Target frame
+ if TRP3_API.target then
+ TRP3_API.target.reset();
+ end
+ -- Glance bar
+ if TRP3_API.register.resetGlanceBar then
+ TRP3_API.register.resetGlanceBar();
+ end
+ -- Toolbar
+ if TRP3_API.toolbar then
+ TRP3_API.toolbar.reset();
+ end
+ ReloadUI();
+ end
+ end
+ });
+end);
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/ui_tools.lua b/totalRP3/tags/0.2.7/core/impl/ui_tools.lua
new file mode 100644
index 000000000..5d9238142
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/ui_tools.lua
@@ -0,0 +1,900 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- UI tools
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+TRP3_API.ui = {
+ tooltip = {},
+ listbox = {},
+ list = {},
+ misc = {},
+ frame = {},
+ text = {}
+}
+
+-- imports
+local globals = TRP3_API.globals;
+local loc = TRP3_API.locale.getText;
+local floor, tinsert, pairs, wipe, assert, _G, tostring, table, type, strconcat = floor, tinsert, pairs, wipe, assert, _G, tostring, table, type, strconcat;
+local MouseIsOver, CreateFrame, ToggleDropDownMenu = MouseIsOver, CreateFrame, ToggleDropDownMenu;
+local UIDropDownMenu_Initialize, UIDropDownMenu_CreateInfo, UIDropDownMenu_AddButton = UIDropDownMenu_Initialize, UIDropDownMenu_CreateInfo, UIDropDownMenu_AddButton;
+local TRP3_MainTooltip, TRP3_MainTooltipTextRight1, TRP3_MainTooltipTextLeft1, TRP3_MainTooltipTextLeft2 = TRP3_MainTooltip, TRP3_MainTooltipTextRight1, TRP3_MainTooltipTextLeft1, TRP3_MainTooltipTextLeft2;
+local shiftDown = IsShiftKeyDown;
+local UnitIsBattlePetCompanion, UnitIsUnit, UnitIsOtherPlayersPet, UnitIsOtherPlayersBattlePet = UnitIsBattlePetCompanion, UnitIsUnit, UnitIsOtherPlayersPet, UnitIsOtherPlayersBattlePet;
+local UnitIsPlayer = UnitIsPlayer;
+local getUnitID = TRP3_API.utils.str.getUnitID;
+local numberToHexa = TRP3_API.utils.color.numberToHexa;
+
+local CONFIG_UI_SOUNDS = "ui_sounds";
+local CONFIG_UI_ANIMATIONS = "ui_animations";
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Frame utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local tiledBackgrounds = {
+ "Interface\\DialogFrame\\UI-DialogBox-Background",
+ "Interface\\BankFrame\\Bank-Background",
+ "Interface\\FrameGeneral\\UI-Background-Marble",
+ "Interface\\FrameGeneral\\UI-Background-Rock",
+ "Interface\\GuildBankFrame\\GuildVaultBG",
+ "Interface\\HELPFRAME\\DarkSandstone-Tile",
+ "Interface\\HELPFRAME\\Tileable-Parchment",
+ "Interface\\QuestionFrame\\question-background",
+ "Interface\\RAIDFRAME\\UI-RaidFrame-GroupBg",
+ "Interface\\Destiny\\EndscreenBG",
+ "Interface\\Stationery\\AuctionStationery1",
+ "Interface\\Stationery\\Stationery_ill1",
+ "Interface\\Stationery\\Stationery_OG1",
+ "Interface\\Stationery\\Stationery_TB1",
+ "Interface\\Stationery\\Stationery_UC1",
+ "Interface\\Stationery\\StationeryTest1",
+ "Interface\\WorldMap\\UI-WorldMap-Middle1",
+ "Interface\\WorldMap\\UI-WorldMap-Middle2",
+ "Interface\\ACHIEVEMENTFRAME\\UI-Achievement-StatsBackground",
+};
+
+function TRP3_API.ui.frame.getTiledBackground(index)
+ return tiledBackgrounds[index] or tiledBackgrounds[1];
+end
+
+function TRP3_API.ui.frame.getTiledBackgroundList()
+ local tab = {};
+ for index, texture in pairs(tiledBackgrounds) do
+ tinsert(tab, {loc("UI_BKG"):format(tostring(index)), index, "|T" .. texture .. ":200:200|t"});
+ end
+ return tab;
+end
+
+function TRP3_API.ui.frame.showIfMouseOverFrame(frame, frameOver)
+ assert(frame and frameOver, "Frames can't be nil");
+ if MouseIsOver(frameOver) then
+ frame:Show();
+ else
+ frame:Hide();
+ end
+end
+
+function TRP3_API.ui.frame.createRefreshOnFrame(frame, time, callback)
+ assert(frame and time and callback, "Argument must be not nil");
+ frame.refreshTimer = 1000;
+ frame:SetScript("OnUpdate", function(arg, elapsed)
+ frame.refreshTimer = frame.refreshTimer + elapsed;
+ if frame.refreshTimer > time then
+ frame.refreshTimer = 0;
+ callback(frame);
+ end
+ end);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Drop down
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local DROPDOWN_FRAME, DropDownList1, CloseDropDownMenus = "TRP3_UIDD", DropDownList1, CloseDropDownMenus;
+local dropDownFrame, currentlyOpenedDrop;
+
+local function openDropDown(anchoredFrame, values, callback, space, addCancel)
+ if not dropDownFrame then
+ dropDownFrame = CreateFrame("Frame", DROPDOWN_FRAME, UIParent, "UIDropDownMenuTemplate");
+ end
+
+ if DropDownList1:IsVisible() then
+ CloseDropDownMenus();
+ return;
+ end
+
+ UIDropDownMenu_Initialize(dropDownFrame,
+ function(uiFrame, level, menuList)
+ local levelValues = menuList or values;
+ level = level or 1;
+ for index, tab in pairs(levelValues) do
+ assert(type(tab) == "table", "Level value is not a table !");
+ local text = tab[1];
+ local value = tab[2];
+ local tooltipText = tab[3];
+ local info = UIDropDownMenu_CreateInfo();
+ info.notCheckable = "true";
+ info.text = text;
+ info.isTitle = false;
+ info.tooltipOnButton = tooltipText ~= nil;
+ info.tooltipTitle = text;
+ info.tooltipText = tooltipText;
+ if tab[3] then
+ info.tooltipTitle = tab[1];
+ info.tooltipText = tab[3];
+ info.tooltipOnButton = true;
+ end
+ if type(value) == "table" then
+ info.hasArrow = true;
+ info.keepShownOnClick = true;
+ info.menuList = value;
+ elseif value then
+ info.func = function()
+ if callback then
+ callback(value, anchoredFrame);
+ end
+ anchoredFrame:GetParent().selectedValue = value;
+ if level > 1 then
+ ToggleDropDownMenu(nil, nil, dropDownFrame);
+ end
+ currentlyOpenedDrop = nil;
+ end;
+ else
+ info.func = function() end;
+ info.isTitle = true;
+ end
+ UIDropDownMenu_AddButton(info, level);
+ end
+ if menuList == nil and addCancel then
+ local info = UIDropDownMenu_CreateInfo();
+ info.notCheckable = "true";
+ info.text = CANCEL;
+ UIDropDownMenu_AddButton(info, level);
+ end
+
+ end,
+ "MENU"
+ );
+ dropDownFrame:SetParent(anchoredFrame);
+ ToggleDropDownMenu(1, nil, dropDownFrame, anchoredFrame:GetName(), -((space or -10)), 0);
+ TRP3_API.ui.misc.playUISound("igMainMenuOptionCheckBoxOn");
+ currentlyOpenedDrop = anchoredFrame;
+end
+TRP3_API.ui.listbox.displayDropDown = openDropDown;
+
+--- Setup a drop down menu for a clickable (Button ...)
+local function setupDropDownMenu(hasClickFrame, values, callback, space, addCancel, rightClick)
+ hasClickFrame:SetScript("OnClick", function(self, button)
+ if (rightClick and button ~= "RightButton") or (not rightClick and button ~= "LeftButton") then return; end
+ openDropDown(hasClickFrame, values, callback, space, addCancel);
+ end);
+end
+TRP3_API.ui.listbox.setupDropDownMenu = setupDropDownMenu;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- ListBox tools
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function listBoxSetSelected(self, index)
+ assert(self and self.values, "Badly initialized listbox");
+ assert(self.values[index], "Array index out of bound");
+ _G[self:GetName().."Text"]:SetText(self.values[index][1]);
+ self.selectedValue = self.values[index][2];
+ if self.callback then
+ self.callback(self.values[index][2], self);
+ end
+end
+
+local function listBoxSetSelectedValue(self, value)
+ assert(self and self.values, "Badly initialized listbox");
+ for index, tab in pairs(self.values) do
+ local val = tab[2];
+ if val == value then
+ listBoxSetSelected(self, index);
+ break;
+ end
+ end
+end
+
+local function listBoxGetValue(self)
+ return self.selectedValue;
+end
+
+-- Setup a ListBox. When the player choose a value, it triggers the function passing the value of the selected element
+local function setupListBox(listBox, values, callback, defaultText, boxWidth, addCancel)
+ assert(listBox and values, "Invalid arguments");
+ assert(_G[listBox:GetName().."Button"], "Invalid arguments: listbox doesn't have a button");
+ boxWidth = boxWidth or 115;
+ listBox.values = values;
+ listBox.callback = callback;
+ local listCallback = function(value)
+ for index, tab in pairs(values) do
+ local text = tab[1];
+ local val = tab[2];
+ if val == value then
+ _G[listBox:GetName().."Text"]:SetText(text);
+ end
+ end
+ if callback then
+ callback(value, listBox);
+ end
+ end;
+
+ setupDropDownMenu(_G[listBox:GetName().."Button"], values, listCallback, boxWidth, addCancel, false);
+
+ listBox.SetSelectedIndex = listBoxSetSelected;
+ listBox.GetSelectedValue = listBoxGetValue;
+ listBox.SetSelectedValue = listBoxSetSelectedValue;
+
+ if defaultText then
+ _G[listBox:GetName().."Text"]:SetText(defaultText);
+ end
+ _G[listBox:GetName().."Middle"]:SetWidth(boxWidth);
+ _G[listBox:GetName().."Text"]:SetWidth(boxWidth-20);
+end
+TRP3_API.ui.listbox.setupListBox = setupListBox;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- List tools
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Handle the mouse wheel for the frame in order to slide the slider
+TRP3_API.ui.list.handleMouseWheel = function(frame,slider)
+ frame:SetScript("OnMouseWheel",function(self,delta)
+ local mini,maxi = slider:GetMinMaxValues();
+ if delta == 1 and slider:GetValue() > mini then
+ slider:SetValue(slider:GetValue()-1);
+ elseif delta == -1 and slider:GetValue() < maxi then
+ slider:SetValue(slider:GetValue()+1);
+ end
+ end);
+ frame:EnableMouseWheel(1);
+end
+
+local function listShowPage(infoTab, pageNum)
+ assert(infoTab.uiTab, "Error : no uiTab in infoTab.");
+
+ -- Hide all widgets
+ for k=1,infoTab.maxPerPage do
+ infoTab.widgetTab[k]:Hide();
+ end
+
+ -- Show list
+ for widgetIndex=1, infoTab.maxPerPage do
+ local dataIndex = pageNum*infoTab.maxPerPage + widgetIndex;
+ if dataIndex <= #infoTab.uiTab then
+ infoTab.widgetTab[widgetIndex]:Show();
+ infoTab.decorate(infoTab.widgetTab[widgetIndex], infoTab.uiTab[dataIndex]);
+ else
+ break;
+ end
+ end
+end
+
+-- Init a list.
+-- Arguments :
+-- infoTab, a structure containing :
+-- - A widgetTab (the list of all widget used in a full page)
+-- - A decorate function, which will receive 3 arguments : a widget and an ID. Decorate will be called on every couple "widget from widgetTab" and "id from dataTab".
+-- dataTab, all the possible values
+-- slider, the slider :3
+TRP3_API.ui.list.initList = function(infoTab, dataTab, slider)
+ assert(infoTab and dataTab and slider, "Error : no argument can be nil.");
+ assert(infoTab.widgetTab, "Error : no widget tab in infoTab.");
+ assert(infoTab.decorate, "Error : no decorate function in infoTab.");
+
+ local count = 0;
+ local maxPerPage = #infoTab.widgetTab;
+ infoTab.maxPerPage = maxPerPage;
+
+ if not infoTab.uiTab then
+ infoTab.uiTab = {};
+ end
+
+ slider:Hide();
+ slider:SetValueStep(1);
+ slider:SetObeyStepOnDrag(true);
+ wipe(infoTab.uiTab);
+
+ if type(dataTab) == "table" then
+ for key,_ in pairs(dataTab) do
+ tinsert(infoTab.uiTab, key);
+ end
+ else
+ for i=1, dataTab, 1 do
+ tinsert(infoTab.uiTab, i);
+ end
+ end
+ count = #infoTab.uiTab;
+
+ table.sort(infoTab.uiTab);
+
+ slider:SetScript("OnValueChanged", nil);
+ if count > maxPerPage then
+ slider:Show();
+ local total = floor((count-1)/maxPerPage);
+ slider:SetMinMaxValues(0, total);
+ else
+ slider:SetValue(0);
+ end
+ slider:SetScript("OnValueChanged",function(self)
+ if self:IsVisible() then
+ listShowPage(infoTab, floor(self:GetValue()));
+ end
+ end);
+ listShowPage(infoTab, slider:GetValue());
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Tooltip tools
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+TRP3_API.ui.tooltip.CONFIG_TOOLTIP_SIZE = "CONFIG_TOOLTIP_SIZE";
+local CONFIG_TOOLTIP_SIZE = TRP3_API.ui.tooltip.CONFIG_TOOLTIP_SIZE;
+local getConfigValue;
+
+TRP3_API.events.listenToEvent(TRP3_API.events.WORKFLOW_ON_LOADED, function()
+ TRP3_API.configuration.registerConfigKey(TRP3_API.ui.tooltip.CONFIG_TOOLTIP_SIZE, 11);
+ getConfigValue = TRP3_API.configuration.getValue;
+end);
+
+local function getTooltipSize()
+ return getConfigValue(CONFIG_TOOLTIP_SIZE) or 11;
+end
+
+-- Show the tooltip for this Frame (the frame must have been set up with setTooltipForFrame).
+-- If already shown, the tooltip text will be refreshed.
+local function refreshTooltip(Frame)
+ local localeFont = TRP3_API.locale.getLocaleFont();
+ if Frame.titleText and Frame.GenFrame and Frame.GenFrameX and Frame.GenFrameY and Frame.GenFrameAnch then
+ TRP3_MainTooltip:Hide();
+ TRP3_MainTooltip:SetOwner(Frame.GenFrame, Frame.GenFrameAnch,Frame.GenFrameX,Frame.GenFrameY);
+ if not Frame.rightText then
+ TRP3_MainTooltip:AddLine(Frame.titleText, 1, 1, 1, true);
+ else
+ TRP3_MainTooltip:AddDoubleLine(Frame.titleText, Frame.rightText);
+ TRP3_MainTooltipTextRight1:SetFont(localeFont, getTooltipSize() + 4);
+ TRP3_MainTooltipTextRight1:SetNonSpaceWrap(true);
+ TRP3_MainTooltipTextRight1:SetTextColor(1, 1, 1);
+ end
+ TRP3_MainTooltipTextLeft1:SetFont(localeFont, getTooltipSize() + 4);
+ TRP3_MainTooltipTextLeft1:SetNonSpaceWrap(true);
+ TRP3_MainTooltipTextLeft1:SetTextColor(1, 1, 1);
+ if Frame.bodyText then
+ TRP3_MainTooltip:AddLine(Frame.bodyText, 1, 0.6666, 0, true);
+ TRP3_MainTooltipTextLeft2:SetFont(localeFont, getTooltipSize());
+ TRP3_MainTooltipTextLeft2:SetNonSpaceWrap(true);
+ TRP3_MainTooltipTextLeft2:SetTextColor(1, 0.75, 0);
+ end
+ TRP3_MainTooltip:Show();
+ end
+end
+TRP3_API.ui.tooltip.refresh = refreshTooltip;
+TRP3_RefreshTooltipForFrame = refreshTooltip; -- For XML integration without too much perf' issue
+
+local function tooltipSimpleOnEnter(self)
+ refreshTooltip(self);
+end
+
+local function tooltipSimpleOnLeave(self)
+ TRP3_MainTooltip:Hide();
+end
+
+-- Setup the frame tooltip (position and text)
+-- The tooltip can be shown by using refreshTooltip(Frame)
+local function setTooltipForFrame(Frame, GenFrame, GenFrameAnch, GenFrameX, GenFrameY, titleText, bodyText, rightText)
+ assert(Frame and GenFrame, "Frame and GenFrame cannot be nil.");
+ if Frame and GenFrame then
+ Frame.GenFrame = GenFrame;
+ Frame.GenFrameX = GenFrameX;
+ Frame.GenFrameY = GenFrameY;
+ Frame.titleText = titleText;
+ Frame.bodyText = bodyText;
+ Frame.rightText = rightText;
+ if GenFrameAnch then
+ Frame.GenFrameAnch = "ANCHOR_"..GenFrameAnch;
+ else
+ Frame.GenFrameAnch = "ANCHOR_TOPRIGHT";
+ end
+ end
+end
+TRP3_API.ui.tooltip.setTooltipForFrame = setTooltipForFrame;
+
+-- Setup the frame tooltip (position and text)
+-- The tooltip can be shown by using refreshTooltip(Frame)
+TRP3_API.ui.tooltip.setTooltipForSameFrame = function(Frame, GenFrameAnch, GenFrameX, GenFrameY, titleText, bodyText, rightText)
+ setTooltipForFrame(Frame, Frame, GenFrameAnch, GenFrameX, GenFrameY, titleText, bodyText, rightText);
+end
+
+-- Setup the frame tooltip and add the Enter and Leave scripts
+TRP3_API.ui.tooltip.setTooltipAll = function(Frame, GenFrameAnch, GenFrameX, GenFrameY, titleText, bodyText, rightText)
+ Frame:SetScript("OnEnter", tooltipSimpleOnEnter);
+ Frame:SetScript("OnLeave", tooltipSimpleOnLeave);
+ setTooltipForFrame(Frame, Frame, GenFrameAnch, GenFrameX, GenFrameY, titleText, bodyText, rightText);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Companion ID
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local DUMMY_TOOLTIP = CreateFrame("GameTooltip", "TRP3_DUMMY_TOOLTIP", nil, "GameTooltipTemplate");
+DUMMY_TOOLTIP:SetOwner( WorldFrame, "ANCHOR_NONE" );
+
+local findPetOwner, findBattlePetOwner, UnitName = TRP3_API.locale.findPetOwner, TRP3_API.locale.findBattlePetOwner, UnitName;
+TRP3_API.ui.misc.TYPE_CHARACTER = "CHARACTER";
+TRP3_API.ui.misc.TYPE_PET = "PET";
+TRP3_API.ui.misc.TYPE_BATTLE_PET = "BATTLE_PET";
+TRP3_API.ui.misc.TYPE_MOUNT = "MOUNT";
+local TYPE_CHARACTER = TRP3_API.ui.misc.TYPE_CHARACTER;
+local TYPE_PET = TRP3_API.ui.misc.TYPE_PET;
+local TYPE_BATTLE_PET = TRP3_API.ui.misc.TYPE_BATTLE_PET;
+
+function TRP3_API.ui.misc.isTargetTypeACompanion(unitType)
+ return unitType == TYPE_BATTLE_PET or unitType == TYPE_PET;
+end
+
+---
+-- Returns target type as first return value and boolean isMine as second.
+function TRP3_API.ui.misc.getTargetType(unitType)
+ if UnitIsPlayer(unitType) then
+ return TYPE_CHARACTER, getUnitID(unitType) == globals.player_id;
+ elseif UnitIsBattlePetCompanion(unitType) then
+ return TYPE_BATTLE_PET, not UnitIsOtherPlayersBattlePet(unitType);
+ elseif UnitIsUnit(unitType, "pet") or UnitIsOtherPlayersPet(unitType) then
+ return TYPE_PET, UnitIsUnit(unitType, "pet");
+ end
+end
+
+local function getDummyGameTooltipTexts()
+ local tab = {};
+ for j = 1, DUMMY_TOOLTIP:NumLines() do
+ tab[j] = _G["TRP3_DUMMY_TOOLTIPTextLeft" .. j]:GetText();
+ end
+ return tab;
+end
+
+local function getCompanionOwner(unitType, targetType)
+ DUMMY_TOOLTIP:SetUnit(unitType);
+ if targetType == TYPE_PET then
+ return findPetOwner(getDummyGameTooltipTexts());
+ elseif targetType == TYPE_BATTLE_PET then
+ return findBattlePetOwner(getDummyGameTooltipTexts());
+ end
+end
+TRP3_API.ui.misc.getCompanionOwner = getCompanionOwner;
+
+function TRP3_API.ui.misc.getCompanionFullID(unitType, targetType)
+ local unitName = UnitName(unitType);
+ if unitName then
+ local owner = getCompanionOwner(unitType, targetType);
+ if owner ~= nil then
+ if not owner:find("-") then
+ owner = owner .. "-" .. globals.player_realm_id;
+ end
+ return owner .. "_" .. unitName, owner;
+ end
+ end
+ return nil;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Toast
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+local TRP3_Toast, TRP3_ToastTextLeft1 = TRP3_Toast, TRP3_ToastTextLeft1;
+
+local function toastUpdate(self, elapsed)
+ self.delay = self.delay - elapsed;
+ if self.delay <= 0 and not self.isFading then
+ self.isFading = true;
+ self:FadeOut();
+ end
+end
+
+TRP3_Toast.delay = 0;
+TRP3_Toast:SetScript("OnUpdate", toastUpdate);
+
+function TRP3_API.ui.tooltip.toast(text, duration)
+ TRP3_Toast:Hide();
+ TRP3_Toast:SetOwner(TRP3_MainFramePageContainer, "ANCHOR_BOTTOM", 0, 60);
+ TRP3_Toast:AddLine(text, 1, 1, 1, true);
+ TRP3_ToastTextLeft1:SetFont("Fonts\\FRIZQT__.TTF", getTooltipSize());
+ TRP3_ToastTextLeft1:SetNonSpaceWrap(true);
+ TRP3_ToastTextLeft1:SetTextColor(1, 1, 1);
+ TRP3_Toast:Show();
+ TRP3_Toast.delay = duration or 3;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Icon utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.ui.frame.setupIconButton(self, icon)
+ assert(self, "Frame is nil");
+ assert(_G[self:GetName().."Icon"], "Frame must have a Icon");
+ _G[self:GetName().."Icon"]:SetTexture("Interface\\ICONS\\"..icon);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Fieldsets
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local FIELDSET_DEFAULT_CAPTION_WIDTH = 100;
+
+function TRP3_API.ui.frame.setupFieldPanel(fieldset, text, size)
+ if fieldset and _G[fieldset:GetName().."CaptionPanelCaption"] then
+ _G[fieldset:GetName().."CaptionPanelCaption"]:SetText(text);
+ if _G[fieldset:GetName().."CaptionPanel"] then
+ _G[fieldset:GetName().."CaptionPanel"]:SetWidth(size or FIELDSET_DEFAULT_CAPTION_WIDTH);
+ end
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Editboxes
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.ui.frame.setupEditBoxesNavigation(tabEditBoxes)
+ local maxBound = # tabEditBoxes;
+ local minBound = 1;
+ for index, editbox in pairs(tabEditBoxes) do
+ editbox:SetScript("OnTabPressed", function(self, button)
+ local cursor = index
+ if shiftDown() then
+ if cursor == minBound then
+ cursor = maxBound
+ else
+ cursor = cursor -1
+ end
+ else
+ if cursor == maxBound then
+ cursor = minBound
+ else
+ cursor = cursor + 1
+ end
+ end
+ tabEditBoxes[cursor]:SetFocus();
+ end)
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Tab bar
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local tabBar_index = 0;
+local tabBar_HEIGHT_SELECTED = 34;
+local tabBar_HEIGHT_NORMAL = 32;
+
+local function tabBar_onSelect(tabGroup, index)
+ assert(#tabGroup.tabs >= index, "Index out of bound.");
+ local i;
+ for i=1, #tabGroup.tabs do
+ local widget = tabGroup.tabs[i];
+ if i == index then
+ widget:SetAlpha(1);
+ widget:Disable();
+ widget:LockHighlight();
+ _G[widget:GetName().."Left"]:SetHeight(tabBar_HEIGHT_SELECTED);
+ _G[widget:GetName().."Middle"]:SetHeight(tabBar_HEIGHT_SELECTED);
+ _G[widget:GetName().."Right"]:SetHeight(tabBar_HEIGHT_SELECTED);
+ widget:GetHighlightTexture():SetAlpha(0.7);
+ widget:GetHighlightTexture():SetDesaturated(1);
+ tabGroup.current = index;
+ else
+ widget:SetAlpha(0.85);
+ widget:Enable();
+ widget:UnlockHighlight();
+ _G[widget:GetName().."Left"]:SetHeight(tabBar_HEIGHT_NORMAL);
+ _G[widget:GetName().."Middle"]:SetHeight(tabBar_HEIGHT_NORMAL);
+ _G[widget:GetName().."Right"]:SetHeight(tabBar_HEIGHT_NORMAL);
+ widget:GetHighlightTexture():SetAlpha(0.5);
+ widget:GetHighlightTexture():SetDesaturated(0);
+ end
+ end
+end
+
+local function tabBar_redraw(tabGroup)
+ local lastWidget;
+ for _, tabWidget in pairs(tabGroup.tabs) do
+ if tabWidget:IsShown() then
+ tabWidget:ClearAllPoints();
+ if lastWidget == nil then
+ tabWidget:SetPoint("LEFT", 0, 0);
+ else
+ tabWidget:SetPoint("LEFT", lastWidget, "RIGHT", 2, 0);
+ end
+ lastWidget = tabWidget;
+ end
+ end
+end
+
+local function tabBar_size(tabGroup)
+ return #tabGroup.tabs;
+end
+
+local function tabBar_setTabVisible(tabGroup, index, isVisible)
+ assert(tabGroup.tabs[index], "Tab index out of bound.");
+ if isVisible then
+ tabGroup.tabs[index]:Show();
+ else
+ tabGroup.tabs[index]:Hide();
+ end
+ tabGroup:Redraw();
+end
+
+local function tabBar_selectTab(tabGroup, index)
+ assert(tabGroup.tabs[index], "Tab index out of bound.");
+ assert(tabGroup.tabs[index]:IsShown(), "Try to select a hidden tab.");
+ tabGroup.tabs[index]:GetScript("OnClick")(tabGroup.tabs[index]);
+end
+
+function TRP3_API.ui.frame.createTabPanel(tabBar, data, callback, confirmCallback)
+ assert(tabBar, "The tabBar can't be nil");
+
+ local tabGroup = {};
+ tabGroup.tabs = {};
+ for index, tabData in pairs(data) do
+ local text = tabData[1];
+ local value = tabData[2];
+ local width = tabData[3];
+ local tabWidget = CreateFrame("Button", "TRP3_TabBar_Tab_" .. tabBar_index, tabBar, "TRP3_TabBar_Tab");
+ tabWidget:SetText(text);
+ tabWidget:SetWidth(width or (text:len() * 11));
+ local clickFunction = function()
+ tabBar_onSelect(tabGroup, index);
+ if callback then
+ callback(tabWidget, value);
+ end
+ end
+ tabWidget:SetScript("OnClick", function(self)
+ if not confirmCallback then
+ clickFunction();
+ else
+ confirmCallback(function() clickFunction() end);
+ end
+ end);
+ tinsert(tabGroup.tabs, tabWidget);
+ tabBar_index = tabBar_index + 1;
+ end
+
+ tabGroup.Redraw = tabBar_redraw;
+ tabGroup.Size = tabBar_size;
+ tabGroup.SetTabVisible = tabBar_setTabVisible;
+ tabGroup.SelectTab = tabBar_selectTab;
+ tabGroup:Redraw();
+
+ return tabGroup;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Textures tools
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local unitTexture = {
+ Human = {
+ "Achievement_Character_Human_Male",
+ "Achievement_Character_Human_Female",
+ },
+ Gnome = {
+ "Achievement_Character_Gnome_Male",
+ "Achievement_Character_Gnome_Female",
+ },
+ Scourge = {
+ "Achievement_Character_Undead_Male",
+ "Achievement_Character_Undead_Female",
+ },
+ NightElf = {
+ "Achievement_Character_Nightelf_Male",
+ "Achievement_Character_Nightelf_Female",
+ },
+ Dwarf = {
+ "Achievement_Character_Dwarf_Male",
+ "Achievement_Character_Dwarf_Female",
+ },
+ Draenei = {
+ "Achievement_Character_Draenei_Male",
+ "Achievement_Character_Draenei_Female",
+ },
+ Orc = {
+ "Achievement_Character_Orc_Male",
+ "Achievement_Character_Orc_Female",
+ },
+ BloodElf = {
+ "Achievement_Character_Bloodelf_Male",
+ "Achievement_Character_Bloodelf_Female",
+ },
+ Troll = {
+ "Achievement_Character_Troll_Male",
+ "Achievement_Character_Troll_Female",
+ },
+ Tauren = {
+ "Achievement_Character_Tauren_Male",
+ "Achievement_Character_Tauren_Female",
+ },
+ Worgen = {
+ "achievement_worganhead",
+ "Ability_Racial_Viciousness",
+ },
+ Goblin = {
+ "Ability_Racial_RocketJump",
+ "Ability_Racial_RocketJump",
+ },
+ Pandaren = {
+ "Achievement_Guild_ClassyPanda",
+ "Achievement_Character_Pandaren_Female",
+ },
+};
+
+local classTexture = {
+ ROGUE = "Ability_Rogue_DualWeild",
+ WARLOCK = "Ability_Warlock_Eradication",
+ PALADIN = "Spell_Paladin_Clarityofpurpose",
+ MONK = "Monk_Ability_Transcendence",
+ MAGE = "spell_Mage_NetherTempest",
+ HUNTER = "Ability_Hunter_MasterMarksman",
+ WARRIOR = "Ability_Warrior_OffensiveStance",
+ DEATHKNIGHT = "Spell_Deathknight_FrostPresence",
+ DRUID = "Spell_druid_tirelesspursuit",
+ SHAMAN = "Ability_Shaman_WindwalkTotem",
+ PRIEST = "Priest_icon_Chakra",
+}
+
+TRP3_API.ui.misc.getUnitTexture = function(race, gender)
+ if unitTexture[race] and unitTexture[race][gender - 1] then
+ return unitTexture[race][gender - 1];
+ end
+ return globals.icons.default;
+end
+
+TRP3_API.ui.misc.getClassTexture = function (class)
+ return classTexture[class] or globals.icons.default;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Text toolbar
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local TAGS_INFO = {
+ {
+ openTags = {"{h1}", "{h1:c}", "{h1:r}"},
+ closeTag = "{/h1}",
+ },
+ {
+ openTags = {"{h2}", "{h2:c}", "{h2:r}"},
+ closeTag = "{/h2}",
+ },
+ {
+ openTags = {"{h3}", "{h3:c}", "{h3:r}"},
+ closeTag = "{/h3}",
+ },
+ {
+ openTags = {"{p:c}", "{p:r}"},
+ closeTag = "{/p}",
+ }
+}
+
+local function insertTag(tag, index, frame)
+ local text = frame:GetText();
+ local pre = text:sub(1, index);
+ local post = text:sub(index + 1);
+ text = strconcat(pre, tag, post);
+ frame:SetText(text);
+end
+
+local function postInsertHighlight(index, tagSize, textSize, frame)
+ frame:SetCursorPosition(index + tagSize + textSize);
+ frame:HighlightText(index + tagSize, index + tagSize + textSize);
+end
+
+local function insertContainerTag(alignIndex, button, frame)
+ assert(button.tagIndex and TAGS_INFO[button.tagIndex], "Button is not properly init with a tag index");
+ local tagInfo = TAGS_INFO[button.tagIndex];
+ local cursorIndex = frame:GetCursorPosition();
+ insertTag(strconcat(tagInfo.openTags[alignIndex], loc("REG_PLAYER_ABOUT_T1_YOURTEXT"), tagInfo.closeTag), cursorIndex, frame);
+ postInsertHighlight(cursorIndex, tagInfo.openTags[alignIndex]:len(), loc("REG_PLAYER_ABOUT_T1_YOURTEXT"):len(), frame);
+end
+
+local function onColorTagSelected(red, green, blue, frame)
+ local cursorIndex = frame:GetCursorPosition();
+ local tag = ("{col:%s}"):format(strconcat(numberToHexa(red), numberToHexa(green), numberToHexa(blue)));
+ insertTag(tag .. "{/col}", cursorIndex, frame);
+ frame:SetCursorPosition(cursorIndex + tag:len());
+end
+
+local function onIconTagSelected(icon, frame)
+ local cursorIndex = frame:GetCursorPosition();
+ local tag = ("{icon:%s:25}"):format(icon);
+ insertTag(tag, cursorIndex, frame);
+ frame:SetCursorPosition(cursorIndex + tag:len());
+end
+
+local function onImageTagSelected(image, frame)
+ local cursorIndex = frame:GetCursorPosition();
+ local tag = ("{img:%s:%s:%s}"):format(image.url, math.min(image.width, 512), math.min(image.height, 512));
+ insertTag(tag, cursorIndex, frame);
+ frame:SetCursorPosition(cursorIndex + tag:len());
+end
+
+local function onLinkTagClicked(frame)
+ local cursorIndex = frame:GetCursorPosition();
+ local tag = ("{link*%s*%s}"):format(loc("UI_LINK_URL"), loc("UI_LINK_TEXT"));
+ insertTag(tag, cursorIndex, frame);
+ frame:SetCursorPosition(cursorIndex + 6);
+ frame:HighlightText(cursorIndex + 6, cursorIndex + 6 + loc("UI_LINK_URL"):len());
+end
+
+-- Drop down
+local function onContainerTagClicked(button, frame, isP)
+ local values = {};
+ if not isP then
+ tinsert(values, {loc("REG_PLAYER_ABOUT_P")});
+ tinsert(values, {loc("CM_LEFT"), 1});
+ tinsert(values, {loc("CM_CENTER"), 2});
+ tinsert(values, {loc("CM_RIGHT"), 3});
+ else
+ tinsert(values, {loc("REG_PLAYER_ABOUT_HEADER")});
+ tinsert(values, {loc("CM_CENTER"), 1});
+ tinsert(values, {loc("CM_RIGHT"), 2});
+ end
+ openDropDown(button, values, function(alignIndex, button) insertContainerTag(alignIndex, button, frame) end, 0, true);
+end
+
+function TRP3_API.ui.text.setupToolbar(toolbar, textFrame)
+ _G[toolbar .. "_Title"]:SetText(loc("REG_PLAYER_ABOUT_TAGS"));
+ _G[toolbar .. "_Image"]:SetText(loc("CM_IMAGE"));
+ _G[toolbar .. "_Icon"]:SetText(loc("CM_ICON"));
+ _G[toolbar .. "_Color"]:SetText(loc("CM_COLOR"));
+ _G[toolbar .. "_Link"]:SetText(loc("CM_LINK"));
+ _G[toolbar .. "_H1"].tagIndex = 1;
+ _G[toolbar .. "_H2"].tagIndex = 2;
+ _G[toolbar .. "_H3"].tagIndex = 3;
+ _G[toolbar .. "_P"].tagIndex = 4;
+ _G[toolbar .. "_H1"]:SetScript("OnClick", function(button) onContainerTagClicked(button, textFrame) end);
+ _G[toolbar .. "_H2"]:SetScript("OnClick", function(button) onContainerTagClicked(button, textFrame) end);
+ _G[toolbar .. "_H3"]:SetScript("OnClick", function(button) onContainerTagClicked(button, textFrame) end);
+ _G[toolbar .. "_P"]:SetScript("OnClick", function(button) onContainerTagClicked(button, textFrame, true) end);
+ _G[toolbar .. "_Icon"]:SetScript("OnClick", function() TRP3_API.popup.showIconBrowser(function(icon) onIconTagSelected(icon, textFrame) end) end);
+ _G[toolbar .. "_Color"]:SetScript("OnClick", function() TRP3_API.popup.showColorBrowser(function(red, green, blue) onColorTagSelected(red, green, blue, textFrame) end) end);
+ _G[toolbar .. "_Image"]:SetScript("OnClick", function() TRP3_API.popup.showImageBrowser(function(image) onImageTagSelected(image, textFrame) end) end);
+ _G[toolbar .. "_Link"]:SetScript("OnClick", function() onLinkTagClicked(textFrame) end);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Sounds
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.ui.misc.playUISound(pathToSound, url)
+ if getConfigValue and getConfigValue(CONFIG_UI_SOUNDS) then
+ if url then
+ PlaySoundFile(pathToSound, "SFX");
+ else
+ PlaySound(pathToSound,"SFX");
+ end
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Animation
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.ui.misc.playAnimation(animationGroup)
+ if getConfigValue and getConfigValue(CONFIG_UI_ANIMATIONS) and animationGroup then
+ animationGroup:Stop();
+ animationGroup:Play();
+ end
+end
\ No newline at end of file
diff --git a/totalRP3/tags/0.2.7/core/impl/utils.lua b/totalRP3/tags/0.2.7/core/impl/utils.lua
new file mode 100644
index 000000000..095750180
--- /dev/null
+++ b/totalRP3/tags/0.2.7/core/impl/utils.lua
@@ -0,0 +1,669 @@
+----------------------------------------------------------------------------------
+-- Total RP 3
+-- Util API
+-- ---------------------------------------------------------------------------
+-- Copyright 2014 Sylvain Cossement (telkostrasz@telkostrasz.be)
+--
+-- 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.
+----------------------------------------------------------------------------------
+
+-- Public accessor
+TRP3_API.utils = {
+ log = {},
+ table = {},
+ str = {},
+ color = {},
+ math = {},
+ serial = {},
+ event = {},
+ music = {},
+ texture = {},
+ message = {},
+ resources = {},
+};
+-- TRP3 imports
+local Globals = TRP3_API.globals;
+local Utils = TRP3_API.utils;
+local Log = Utils.log;
+local loc = TRP3_API.locale.getText;
+
+-- WOW imports
+local pcall, tostring, pairs, type, print, string, date, math, strconcat, wipe, tonumber = pcall, tostring, pairs, type, print, string, date, math, strconcat, wipe, tonumber;
+local tinsert, assert, _G, tremove, next = tinsert, assert, _G, tremove, next;
+local PlayMusic, StopMusic = PlayMusic, StopMusic;
+local UnitFullName = UnitFullName;
+local UNKNOWNOBJECT = UNKNOWNOBJECT;
+local SetPortraitToTexture = SetPortraitToTexture;
+local showLog = false;
+local getZoneText, getSubZoneText = GetZoneText, GetSubZoneText;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Chat frame
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+Utils.print = function(...)
+ print(...);
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- LOGGING
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+function TRP3_API.utils.log.on()
+ showLog = true;
+end
+
+function TRP3_API.utils.log.off()
+ showLog = false;
+end
+
+-- The log level defines the prefix color and serves as filter
+Log.level = {
+ INFO = "-|cff00ffffINFO|r] ",
+ WARNING = "-|cffffaa00WARNING|r] ",
+ SEVERE = "-|cffff0000SEVERE|r] "
+}
+
+-- Print a log message to the chatFrame.
+local function log(message, level)
+ if not level then level = Log.level.INFO; end
+ if not showLog then
+ return;
+ end
+ Utils.print( "[TRP3".. level ..tostring(message));
+end
+Log.log = log;
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Messaging
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local MESSAGE_PREFIX = "[|cffffaa00TRP3|r] ";
+
+local function getChatFrame()
+ return DEFAULT_CHAT_FRAME;
+end
+
+-- CHAT_FRAME : ChatFrame (given by chatFrameIndex or default if nil)
+-- ALERT_POPUP : TRP3 alert popup
+-- RAID_ALERT : On screen alert (Raid notice frame)
+Utils.message.type = {
+ CHAT_FRAME = 1,
+ ALERT_POPUP = 2,
+ RAID_ALERT = 3
+};
+local messageTypes = Utils.message.type;
+
+-- Display a simple message. Nil free.
+Utils.message.displayMessage = function(message, messageType, noPrefix, chatFrameIndex)
+ if not messageType or messageType == messageTypes.CHAT_FRAME then
+ local chatFrame = _G["ChatFrame"..tostring(chatFrameIndex)] or getChatFrame();
+ if noPrefix then
+ chatFrame:AddMessage(tostring(message), 1, 1, 1);
+ else
+ chatFrame:AddMessage(MESSAGE_PREFIX..tostring(message), 1, 1, 1);
+ end
+ elseif messageType == messageTypes.ALERT_POPUP then
+ TRP3_API.popup.showAlertPopup(tostring(message));
+ elseif messageType == messageTypes.RAID_ALERT then
+ RaidNotice_AddMessage(RaidWarningFrame, tostring(message), ChatTypeInfo["RAID_WARNING"]);
+ end
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Table utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- Print all table content (resursively)
+-- Debug purpose
+-- Better than /dump as it prints one message per line (avoid chat show limit)
+local dumpColor1, dumpColor2, dumpColor3, dumpColor4 = "|cffffaa00", "|cff00ff00", "|cffffff00", "|cffff9900";
+local function tableDump(table, level, withCount)
+ local i = 0;
+ local dumpIndent = "";
+
+ for indent = 1, level, 1 do
+ dumpIndent = dumpIndent .. " ";
+ end
+
+ if type(table) == "table" then
+ for key, value in pairs(table) do
+ if type(value) == "table" then
+ print(dumpIndent .. dumpColor2 .. key .. "|r=".. dumpColor3 .. "{");
+ tableDump(value, level + 1);
+ print(dumpIndent .. dumpColor3 .. "}");
+ elseif type(value) == "function" then
+ print(dumpIndent .. dumpColor2 .. key .. "|r=" .. dumpColor4 .. " <" .. type(value) ..">");
+ else
+ print(dumpIndent .. dumpColor2 .. key .. "|r=" .. dumpColor3 .. tostring(value) .. dumpColor4 .. " <" .. type(value) ..">");
+ end
+ i = i + 1;
+ end
+ end
+
+ if withCount then
+ print(dumpIndent .. dumpColor1 .. ("Level %s size: %s elements"):format(level, i));
+ end
+end
+
+Utils.table.dump = function(table, withCount)
+ print(dumpColor1 .. "Dump table ".. tostring(table));
+ if table then
+ tableDump(table, 1, withCount);
+ end
+end
+
+-- Recursively copy all content from a table to another one.
+-- Argument "destination" must be a non nil table reference.
+local function tableCopy(destination, source)
+ if destination == nil or source == nil then return end
+ for k,v in pairs(source) do
+ if(type(v)=="table") then
+ destination[k] = {};
+ tableCopy(destination[k], v);
+ else
+ destination[k] = v;
+ end
+ end
+end
+Utils.table.copy = tableCopy;
+
+-- Return the table size.
+-- Less effective than #table but works for hash table as well (#hashtable don't).
+local function tableSize(table)
+ local count = 0;
+ for _,_ in pairs(table) do
+ count = count + 1;
+ end
+ return count;
+end
+Utils.table.size = tableSize;
+
+-- Remove an object from table
+-- Return true if the object is found.
+-- Object is search with == operator.
+Utils.table.remove = function(table, object)
+ for index, value in pairs(table) do
+ if value == object then
+ tremove(table, index);
+ return true;
+ end
+ end
+ return false;
+end
+
+function Utils.table.keys(table)
+ local keys = {};
+ for key, _ in pairs(table) do
+ tinsert(keys, key);
+ end
+ return keys;
+end
+
+-- Create a weak tables pool.
+local TABLE_POOL = setmetatable( {}, { __mode = "k" } );
+
+-- Return an already created table, or a new one if the pool is empty
+-- It ultra mega important to release the table once you finished using it !
+function Utils.table.getTempTable()
+ local t = next( TABLE_POOL );
+ if t then
+ TABLE_POOL[t] = nil;
+ return wipe(t);
+ end
+ return {};
+end
+
+-- Release a temp table.
+function Utils.table.releaseTempTable(table)
+ TABLE_POOL[ table ] = true;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- String utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+-- A secure way to check if a String matches a pattern.
+-- This is useful when using user-given pattern, as malformed pattern would produce lua error.
+Utils.str.match = function(stringToCheck, pattern)
+ local ok, result = pcall(string.find, string.lower(stringToCheck), string.lower(pattern));
+ if not ok then
+ return false; -- Syntax error.
+ end
+ -- string.find should return a number if the string matches the pattern
+ return string.find(tostring(result), "%d");
+end
+
+-- Generate a pseudo-unique random ID.
+-- If you encounter a collision, you really should playing lottery
+-- ID's have a id_length characters length
+local function generateID()
+ local i;
+ local ID = date("%m%d%H%M%S");
+ for i=1, 5 do
+ ID = ID..string.char(math.random(33,126));
+ end
+ return ID;
+end
+Utils.str.id = generateID;
+
+-- Create a unit ID from a unit name and unit realm. If realm = nil then we use current realm.
+-- This method ALWAYS return a nil free UnitName-RealmShortName string.
+Utils.str.unitInfoToID = function(unitName, unitRealmID)
+ return strconcat(unitName or "_", '-', unitRealmID or Globals.player_realm_id);
+end
+
+-- Separates the unit name and realm from an unit ID
+Utils.str.unitIDToInfo = function(unitID)
+ if not unitID:find('-') then
+ return unitID, Globals.player_realm_id;
+ end
+ return unitID:sub(1, unitID:find('-') - 1), unitID:sub(unitID:find('-') + 1);
+end
+
+-- Separates the owner ID and companion name from a companion ID
+Utils.str.companionIDToInfo = function(companionID)
+ if not companionID:find('_') then
+ return companionID, nil;
+ end
+ return companionID:sub(1, companionID:find('_') - 1), companionID:sub(companionID:find('_') + 1);
+end
+
+-- Create a unit ID based on a targetType (target, player, mouseover ...)
+-- The returned id can be nil.
+Utils.str.getUnitID = function(unit)
+ local playerName, realm = UnitFullName(unit);
+ if not playerName or playerName:len() == 0 or playerName == UNKNOWNOBJECT then
+ return nil;
+ end
+ if not realm then
+ realm = Globals.player_realm_id;
+ end
+ return playerName .. "-" .. realm;
+end
+
+-- Return an texture text tag based on the given image url and size.
+Utils.str.texture = function(iconPath, iconSize)
+ assert(iconPath, "Icon path is nil.");
+ iconSize = iconSize or 15;
+ return strconcat("|T", iconPath, ":", iconSize, ":", iconSize, "|t");
+end
+
+-- Return an texture text tag based on the given icon url and size. Nil safe.
+Utils.str.icon = function(iconPath, iconSize)
+ iconPath = iconPath or Globals.icons.default;
+ return Utils.str.texture("Interface\\ICONS\\" .. iconPath, iconSize);
+end
+
+-- Return a color tag based on a letter
+Utils.str.color = function(color)
+ color = color or "w"; -- default color if bad argument
+ if color == "r" then return "|cffff0000" end -- red
+ if color == "g" then return "|cff00ff00" end -- green
+ if color == "b" then return "|cff0000ff" end -- blue
+ if color == "y" then return "|cffffff00" end -- yellow
+ if color == "p" then return "|cffff00ff" end -- purple
+ if color == "c" then return "|cff00ffff" end -- cyan
+ if color == "w" then return "|cffffffff" end -- white
+ if color == "0" then return "|cff000000" end -- black
+ if color == "o" then return "|cffffaa00" end -- orange
+end
+
+-- If the given string is empty, return nil
+Utils.str.emptyToNil = function(text)
+ if text and #text > 0 then
+ return text;
+ end
+ return nil;
+end
+
+-- Assure that the given string will not be nil
+Utils.str.nilToEmpty = function(text)
+ return text or "";
+end
+
+function Utils.str.buildZoneText()
+ local text = getZoneText(); -- assuming that there is ALWAYS a zone text. Don't know if it's true.
+ if getSubZoneText():len() > 0 then
+ text = strconcat(text, " - ", getSubZoneText());
+ end
+ return text;
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Colors
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+--- Value must be 256 based
+local function numberToHexa(number)
+ local number = string.format('%x', number);
+ if number:len() == 1 then
+ number = '0' .. number;
+ end
+ return number;
+end
+Utils.color.numberToHexa = numberToHexa;
+
+--- Value must be a string with hexa decimal representation
+local function hexaToNumber(hexa)
+ if not hexa then
+ return nil, nil, nil;
+ end
+ local redH = tonumber(hexa:sub(1, 2), 16)
+ local greenH = tonumber(hexa:sub(3, 4), 16)
+ local blueH = tonumber(hexa:sub(5, 6), 16)
+ return redH, greenH, blueH;
+end
+Utils.color.hexaToNumber = hexaToNumber;
+
+--- Values must be 256 based
+local function colorCode(red, green, blue)
+ local redH = numberToHexa(red);
+ local greenH = numberToHexa(green);
+ local blueH = numberToHexa(blue);
+ return strconcat("|cff", redH, greenH, blueH);
+end
+Utils.color.colorCode = colorCode;
+
+--- Values must be 0..1 based
+Utils.color.colorCodeFloat = function(red, green, blue)
+ return colorCode(math.ceil(red*255), math.ceil(green*255), math.ceil(blue*255));
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Math
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local function incrementNumber(version, figures)
+ local incremented = version + 1;
+ if incremented >= math.pow(10, figures) then
+ incremented = 1;
+ end
+ return incremented;
+end
+Utils.math.incrementNumber = incrementNumber;
+
+--- Return the interpolation.
+-- delta is a number between 0 and 1;
+local function lerp(delta, from, to)
+ local diff = to - from;
+ return from + (delta * diff);
+end
+Utils.math.lerp = lerp;
+
+Utils.math.color = function(delta, fromR, fromG, fromB, toR, toG, toB)
+ return lerp(delta, fromR, toR), lerp(delta, fromG, toG), lerp(delta, fromB, toB);
+end
+
+--- Values must be 256 based
+Utils.math.colorCode = function(delta, fromR, fromG, fromB, toR, toG, toB)
+ return colorCode(lerp(delta, fromR, toR), lerp(delta, fromG, toG), lerp(delta, fromB, toB));
+end
+
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+-- Text tags utils
+--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+local directReplacements = {
+ ["/col"] = "|r",
+};
+
+local function convertTextTag(tag)
+
+ if directReplacements[tag] then -- Direct replacement
+ return directReplacements[tag];
+ elseif tag:match("^col%:%a$") then -- Color replacement
+ return Utils.str.color(tag:match("^col%:(%a)$"));
+ elseif tag:match("^col:%x%x%x%x%x%x$") then -- Hexa color replacement
+ return "|cff"..tag:match("^col:(%x%x%x%x%x%x)$");
+ elseif tag:match("^icon%:[%w%s%_%-%d]+%:%d+$") then -- Icon
+ local icon, size = tag:match("^icon%:([%w%s%_%-%d]+)%:(%d+)$");
+ return Utils.str.icon(icon, size);
+ end
+
+ return "{"..tag.."}";
+end
+
+local function convertTextTags(text)
+ if text then
+ text = text:gsub("%{(.-)%}", convertTextTag);
+ return text;
+ end
+end
+Utils.str.convertTextTags = convertTextTags;
+
+local escapedHTMLCharacters = {
+ ["<"] = "<",
+ [">"] = ">",
+ ["\""] = """,
+};
+
+local structureTags = {
+ ["{h(%d)}"] = "",
+ ["{h(%d):c}"] = "",
+ ["{h(%d):r}"] = "",
+ ["{/h(%d)}"] = "",
+
+ ["{p}"] = "
",
+ ["{p:c}"] = "
",
+ ["{p:r}"] = "
",
+ ["{/p}"] = "
",
+};
+
+-- Convert the given text by his HTML representation
+Utils.str.toHTML = function(text)
+
+ -- 1) Replacement : & character
+ text = text:gsub("&", "&");
+
+ -- 2) Replacement : escape HTML characters
+ for pattern, replacement in pairs(escapedHTMLCharacters) do
+ text = text:gsub(pattern, replacement);
+ end
+
+ -- 3) Replacement : text tags
+ for pattern, replacement in pairs(structureTags) do
+ text = text:gsub(pattern, replacement);
+ end
+
+ local tab = {};
+ local i=1;
+ while text:find("<") and i<200 do
+
+ local before;
+ before = text:sub(1, text:find("<") - 1);
+ if #before > 0 then
+ tinsert(tab, before);
+ end
+
+ local tagText;
+
+ local tag = text:match("(.-)>");
+ if tag then
+ tagText = text:sub( text:find("<"), text:find("") + #tag + 2);
+ if #tagText == #tag + 3 then
+ return "Error in pattern"; -- TODO locals
+ end
+ tinsert(tab, tagText);
+ else
+ return "Error in pattern : tag not closed"; -- TODO locals
+ end
+
+ local after;
+ after = text:sub(#before + #tagText + 1);
+ text = after;
+
+ -- Log.log("Iteration "..i);
+ -- Log.log("before ("..(#before).."): "..before);
+ -- Log.log("tagText ("..(#tagText).."): "..tagText);
+ -- Log.log("after ("..(#before).."): "..after);
+
+ i = i+1;
+ if i == 500 then
+ log("HTML overfloooow !", Log.level.SEVERE);
+ end
+ end
+ if #text > 0 then
+ tinsert(tab, text); -- Rest of the text
+ end
+
+ -- log("Parts count "..(#tab));
+
+ local finalText = "";
+ for _, line in pairs(tab) do
+ if not line:find("<") then
+ line = "
"..line.."
";
+ end
+ line = line:gsub("\n"," ");
+
+ line = line:gsub("{img%:(.-)%:(.-)%:(.-)%}",
+ "